gpt4 book ai didi

XML XSLT 命名空间

转载 作者:行者123 更新时间:2023-12-04 17:04:42 24 4
gpt4 key购买 nike

我得到了一个命名空间为“tns”的 xml 文件。我想使用 xslt 而不在任何地方使用 'tns',而是使用匹配的模板而不是声明一次的 tns 命名空间并使用那个。我想将根 tns:cv (xml) 匹配到我的根 cv (xsl) 我的 xslt 有什么问题,因为它显示了 xml 元素,而不是其中的内容?

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="multiLanguageToSingle.xslt"?>
<tns:cv xmlns:tns="http://www.i8c.be/CvService/1.0">
<tns:generalLanguage>nl</tns:generalLanguage>
<tns:careerPath>
<tns:current>
<tns:company language="nl">
<tns:companyName></tns:companyName>
<tns:description></tns:description>
</tns:company>
</tns:current>
<tns:former>
<tns:company language="nl">
<tns:companyName></tns:companyName>
<tns:description></tns:description>
</tns:company>
</tns:former>
</tns:careerPath>
<tns:companyDetails>
<tns:address>

我想对上述 xml 使用 xsl(前几行):
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="http://www.i8c.be/CvService/1.0">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes" />
<xsl:template match="/">
<xsl:apply-templates select="/tns:cv" />
</xsl:template>

<xsl:template match="/tns:cv">
<cv xsi:schemaLocation="http://www.i8c.be/CvService/1.0 cvDataTemplate.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:variable name="language" select='"nl"'/>
<careerPath>
<current>
<xsl:for-each select="cv/careerPath/current/company[@language=$language]">
<companyName><xsl:value-of select="companyName"/></companyName>
<description><xsl:value-of select="description"/></description>
</xsl:for-each>
</current>

<former>
<xsl:for-each select="cv/careerPath/former/company[@language=$language]">
<companyName><xsl:value-of select="companyName"/></companyName>
<description><xsl:value-of select="description"/></description>
</xsl:for-each>
</former>
</careerPath>

最佳答案

关于命名空间的重要一点是,XML 文件中的命名空间并不是真正的 tns东西——这只是实际命名空间的文件本地名称/缩写,即 http://www.i8c.be/CvService/1.0 .现在,您在 xslt 文件中选择了相同的缩写(这对可读性很有意义,但就工具而言是完全可选的)。因此,您不能指望 cv/careerPath/current/company[@language=$language]匹配任何东西,有两个原因:

  • 没有careerPath XML 文件中默认命名空间中的元素。那将需要是 tns:careerPath ,对于 XPath 字符串的其他组件也类似。
  • 您要求与您最上层的匹配 tns:cv元素已经是上下文节点,因为在 xsl:tenplate 内匹配它。由于该节点不包含 cv child,一个以 cv/ 开头的 XPath导致空节点集。

  • 因此,删除 cv/在您的查询开始时,或者
  • 添加命名空间限定符或
  • 通过放置 xmlns="http://www.i8c.be/CvService/1.0" 更改 XSLT 文件中的默认 namespace 在一些足够远的元素上。 (请注意,这也会影响输出的非限定元素名称。)
  • 关于XML XSLT 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10494966/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com