你能告诉我如何使用XSLT执行此操作吗?
<?xml version="1.0"?>
<A>
<BB bb1="bb1" />
<CC cc1="cc1" />
<DD name="name1">
<EEE type="foo" value="50">
<FFFF id="id1">
</EEE>
</DD>
<DD name="name2">
<EEE type="bar" value="50">
<FFFF id="id2">
</EEE>
</DD>
<DD name="name3">
<EEE type="foo" value="40">
<FFFF id="id3">
</EEE>
</DD>
<?xml version="1.0"?>
<A>
<BB bb1="bb1" />
<CC cc1="cc1" />
<DD name="name3">
<EEE type="foo" value="40">
<FFFF id="id3">
</EEE>
</DD>
<DD name="name1">
<EEE type="foo" value="50">
<FFFF id="id1">
</EEE>
</DD>
即。复制所有,除非它是DD,只有在EEE / @ type =“foo”时复制,并按EEE / @值对所有DD进行排序。
现在我刚刚找到xsl代码来复制所有内容并按EEE / @类型排序。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="EEE/@type" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
这已经足够好但我真的只想保留那些在EEE / @ type = foo的DD。
非常感谢你。
答案 0 :(得分:1)
尝试使用xpath选择所需的节点
这应该只复制EEE&#39;属性类型= foo
的元素<xsl:template match="//EEE[@type='foo']">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
答案 1 :(得分:1)
要
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="EEE/@type" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
你只需要添加一个模板
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="EEE/@type" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="DD[not(EEE/@type = 'foo')]"/>
确保不会复制DD
不等于EEE/@type
的{{1}}元素。