假设我有这个XML文档,其中......只表示其他杂项节点:
<AA>
<BB>
<CC>True</CC>
...
</BB>
<BB>
<CC>True</CC>
...
</BB>
<BB>
<CC>False</CC>
...
</BB>
<BB>
<CC>True</CC>
...
</BB>
<BB>
<CC>False</CC>
...
</BB>
</AA>
我正在尝试制作一些模板,例如:
<xsl:template match="/">
<DD>
<xsl:apply-templates select="/AA/YYY" />
</DD>
<EE>
<xsl:apply-templates select="/AA/XXX" />
</EE>
</xsl:template>
<xsl:template match="YYY">
<!-- do stuff -->
</xsl:template>
<xsl:template match="XXX">
<!-- do stuff -->
</xsl:template>
产生类似于此的输出:
<AA>
<DD>
<BB>
<CC>True</CC>
</BB>
<BB>
<CC>True</CC>
...
</BB>
<BB>
<CC>True</CC>
...
</BB>
</DD>
<EE>
<BB>
<CC>False</CC>
...
</BB>
<BB>
<CC>False</CC>
...
</BB>
</EE>
</AA>
我正在努力寻找放置在匹配属性中的xpath,我目前放置XXX和YYY。有人得到了答案吗?
基本上我想选择具有包含特定内容的子节点的所有节点。
答案 0 :(得分:1)
如果您使用身份转换,如果您不打算更改<BB>
元素中的任何内容,则不需要任何其他模板。
XML输入
<AA>
<BB>
<CC>True</CC>
...
</BB>
<BB>
<CC>True</CC>
...
</BB>
<BB>
<CC>False</CC>
...
</BB>
<BB>
<CC>True</CC>
...
</BB>
<BB>
<CC>False</CC>
...
</BB>
</AA>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/AA">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<DD>
<xsl:apply-templates select="BB[CC='True']"/>
</DD>
<EE>
<xsl:apply-templates select="BB[CC='False']"/>
</EE>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML输出
<AA>
<DD>
<BB>
<CC>True</CC>
...
</BB>
<BB>
<CC>True</CC>
...
</BB>
<BB>
<CC>True</CC>
...
</BB>
</DD>
<EE>
<BB>
<CC>False</CC>
...
</BB>
<BB>
<CC>False</CC>
...
</BB>
</EE>
</AA>
如果您确实需要更改<BB>
添加其他模板以覆盖身份转换。