给出像
这样的输入<a>
<b>
<c>everything below</c>
<d></d>
</b>
<b>
<c>everything below</c>
<d></d>
</b>
</a>
,是否有一个很好的Xpath解决方案来获取
<a>
<c>everything below</c>
<c>everything below</c>
</a>
,(所以说要做一个“unwrap-remove-select-wrap”),或者我怎样才能最舒服地实现这个目标?
答案 0 :(得分:1)
使用:
<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="a | c">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出:
<a>
<c>everything below</c>
<c>everything below</c>
</a>
答案 1 :(得分:0)
<xsl:template match="a">
<xsl:copy>
<xsl:apply-templates select="//c"/>
</xsl:copy>
</xsl:template>
<xsl:template match="c">
<xsl:copy>
<xsl:value-of select="."/>
</xsl:copy>
</xsl:template>
答案 2 :(得分:0)
试一试
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*">
<a>
<xsl:for-each select="//c">
<xsl:copy-of select="." />
</xsl:for-each>
</a>
</xsl:template>
</xsl:stylesheet>
答案 3 :(得分:0)
identity rule的以下修改可能是最简单,最优雅的解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()[not(self::b or self::d)]|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<a>
<b>
<c>everything below</c>
<d></d>
</b>
<b>
<c>everything below</c>
<d></d>
</b>
</a>
产生了想要的正确结果:
<a>
<c>everything below</c>
<c>everything below</c>
</a>
说明:
身份规则的此修改会“按原样”复制每个节点,但任何b
或d
元素除外。
任何b
或d
元素都由元素的默认(内置)XSLT模板处理,这些模板在其子元素上应用模板(它们没有这样的元素,因此需要“删除“效果已实现”。
答案 4 :(得分:0)
感谢所有人,我想我能找到你想要的答案帮助:
<xsl:for-each select="a">
<xsl:copy>
<xsl:copy-of select="./b/c|@*" />
</xsl:copy>
</xsl:for-each>
......我认为,在不使用其他模板的情况下,以简洁的方式做我想要的事情。