无法获得正确的XSLT输出

时间:2012-02-21 04:15:18

标签: xslt

我有这样的XML:

<Section>
    <Chapter>
        <Head>Heading</Head>
        <nametable>
            <nametitle>MyTitle</nametitle>
            <namedomain>MyDomain</namedomain>
            <namevalue>value1</namevalue>
        </nametable>
        <nametable>
            <nametitle>MyTitle2</nametitle>
            <namedomain>MyDomain2</namedomain>
            <namevalue>value2</namevalue>
        </nametable>
    </Chapter>
</Section>

我想得到这个输出:

MyTitle2
MyDomain2
value2

我使用text()函数来检查文本内容,但它不会打印任何内容。

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">

<xsl:template match="//Chapter">
    <xsl:comment>Ignore Head tag</xsl:comment>
    <xsl:apply-templates select="*[not(self::Head)]"/>
</xsl:template>

<xsl:template match="nametable">
     <xsl:for-each select="nametitle">
        <xsl:if test="text()='MyTitle2'">
            <xsl:apply-templates select="nametitle" />
        </xsl:if>
    </xsl:for-each>
</xsl:template>

<xsl:template match="nametitle">
    <xsl:apply-templates />
</xsl:template>

</xsl:stylesheet>

我做错了什么?

谢谢!

约翰

2 个答案:

答案 0 :(得分:2)

产生相同结果的两种选择:

<xsl:template match="nametitle[text()='MyTitle2']">
 <xsl:value-of select="parent::node()"/>
 <xsl:text>&#xA;</xsl:text>
</xsl:template>

<xsl:template match="*[nametitle[text()='MyTitle2']]">
 <xsl:value-of select="."/>
 <xsl:text>&#xA;</xsl:text>
</xsl:template> 

答案 1 :(得分:1)

您的问题在这里

 <xsl:for-each select="nametitle">
    <xsl:if test="text()='MyTitle2'">
        <xsl:apply-templates select="nametitle" />
    </xsl:if>
</xsl:for-each>

如果测试成功,则模板将应用于当前节点的nametitle子节点。

但是,当前节点为nametitle且没有nametitle个孩子 - 因此未选择任何节点且未应用任何模板。

<强>解决方案

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="text"/>

 <xsl:template match="nametable[nametitle = 'MyTitle2']/*">
  <xsl:value-of select="."/>
  <xsl:text>&#xA;</xsl:text>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的XML文档

<Section>
    <Chapter>
        <Head>Heading</Head>
        <nametable>
            <nametitle>MyTitle</nametitle>
            <namedomain>MyDomain</namedomain>
            <namevalue>value1</namevalue>
        </nametable>
        <nametable>
            <nametitle>MyTitle2</nametitle>
            <namedomain>MyDomain2</namedomain>
            <namevalue>value2</namevalue>
        </nametable>
    </Chapter>
</Section>

生成想要的正确结果

        MyTitle2
        MyDomain2
        value2