例如,我有以下XML:
<Root>
<A>
<H>header1</H>
<B>
<C>2</C>
</B>
</A>
<A>
<H>header2</H>
<B>
<C>3</C>
</B>
</A>
<A>
<H>header3</H>
</A>
<A>
<H>header4</H>
</A>
</Root>
我想要一个转换,以仅获取具有B个子元素的A个元素的H个元素。我写了以下XSLT:
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Root>
<xsl:apply-templates/>
</Root>
</xsl:template>
<xsl:template match="A[B]">
<Row>
<Result>
<xsl:value-of select="H"/>
</Result>
</Row>
</xsl:template>
</xsl:stylesheet>
输出为(使用Notepad ++的XML Tools插件):
<?xml version="1.0"?>
<Root>
<Row><Result>header1</Result></Row>
<Row><Result>header2</Result></Row>
header3
header4
</Root>
为什么只有纯字符串“ header3”和“ header4”?我预期如下:
<?xml version="1.0"?>
<Root>
<Row><Result>header1</Result></Row>
<Row><Result>header2</Result></Row>
</Root>
答案 0 :(得分:1)
当您这样做:
<xsl:apply-templates/>
您正在将模板应用于Root
元素。您没有与Root
匹配的模板,因此它由built-in template rules处理。这些模板递归处理Root
及其所有后代(除了A[B]
,您确实有一个模板),并将所有文本节点复制到输出中。
请尝试:
<xsl:stylesheet version = "1.0"
xmlns:xsl ="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/Root">
<Root>
<xsl:apply-templates select="A[B]"/>
</Root>
</xsl:template>
<xsl:template match="A">
<Row>
<Result>
<xsl:value-of select="H"/>
</Result>
</Row>
</xsl:template>
</xsl:stylesheet>