0

我有一个名称空间为“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>
4

1 回答 1

1

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

  • XML 文件的默认命名空间中没有careerPath元素。对于 XPath 字符串的其他组件,这将需要是tns:careerPath,并且类似。
  • 您正在请求与您的最顶层tns:cv元素的匹配,因为它已经是上下文节点,因为它位于其上的xsl:tenplate匹配中。由于该节点不包含子节点,因此以空节点集cv开头的 XPath 。cv/

因此,删除cv/查询开头的

  • 添加命名空间限定符或
  • xmlns="http://www.i8c.be/CvService/1.0"通过放置一些足够远的元素来更改 XSLT 文件中的默认名称空间。(请注意,这也会影响输出的非限定元素名称。)
于 2012-05-08T12:33:00.820 回答