我一直在尝试为此获得解决方案,但仍无法找到合适的解决方案。 我引用了几个链接Nested for-each loops, accessing outer element with variable from the inner loop和How to extract child tags text and extended text of parent tag from xml using xslt,但这些问题没有嵌套标记。
我的XML:
<catalog title="TitleABC1">
<cd>
<title code="Y">Picture book</title>
<artist>Simply Red</artist>
<country>EU</country>
</cd>
<catalog title="TitleABC2">
<cd>
<cd>
<title code="N">Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
</cd>
</cd>
<cd>
<cd>
<cd>
<title code="Y">Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
</cd>
</cd>
</cd>
<cd>
<catalog title="TitleABC3">
<cd>
<title code="N">Red</title>
<artist>The Communards</artist>
<country>UK</country>
</cd>
</catalog>
</cd>
<cd>
<title code="N">Unchain my heart</title>
<artist>Joe Cocker</artist>
<country>USA</country>
</cd>
</catalog>
</catalog>
对于上述XML,条件是,如果任何子/后代catalog
标记的代码属性为“Y”,则仅显示那些title
标记的标题。
因此,输出应该像:
TitleABC1
TitleABC2
我正在尝试使用以下XSLT逻辑,但无法获得所需的解决方案。
<xsl:template match="catalog">
<!-- Store the value in a variable -->
<xsl:for-each select="//title">
<!-- <xsl:if> to check for the code attrib -->
</xsl:for-each>
</xsl:template>
答案 0 :(得分:1)
只有那些
catalog
标签才会被显示 子/后代title
代码的代码属性为&#39; Y&#39;。
为什么不完全按照你所说的去做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:for-each select="//catalog[descendant::title/@code='Y']">
<xsl:value-of select="@title" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
或者,如果您更喜欢递归方法:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="catalog[descendant::title/@code='Y']">
<xsl:value-of select="@title" />
<xsl:text> </xsl:text>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
您需要了解built-in template rules以了解其工作原理。