我有这样的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>
我做错了什么?
谢谢!
约翰
答案 0 :(得分:2)
产生相同结果的两种选择:
<xsl:template match="nametitle[text()='MyTitle2']">
<xsl:value-of select="parent::node()"/>
<xsl:text>
</xsl:text>
</xsl:template>
和
<xsl:template match="*[nametitle[text()='MyTitle2']]">
<xsl:value-of select="."/>
<xsl:text>
</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>
</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