我希望在父级具有属性d
时删除元素<!-- d -->
并发表评论c="string1"
输入:
<a>
<b c="string1">
<!-- d -->
<d>
<e/>
</d>
<f/>
</b>
<b c="string2">
<!-- d -->
<d>
<e/>
</d>
<f/>
</b>
</a>
期望的输出:
<a>
<b c="string1">
<f/>
</b>
<b c="string2">
<!-- d -->
<d>
<e/>
</d>
<f/>
</b>
</a>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<!-- Identity transform -->
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Those templates do not work -->
<xsl:template match="d[???]" />
<xsl:template match="comment()="d" />
</xsl:stylesheet>
答案 0 :(得分:1)
这是你可以看到它的一种方式:
<xsl:template match="b[@c='string1']/d" />
<xsl:template match="b[@c='string1']/comment()[.=' d ']" />
或者,如果您愿意:
<xsl:template match="b[@c='string1']">
<xsl:copy>
<xsl:apply-templates select="@*|node()[not(self::d or self::comment()[.=' d '])]"/>
</xsl:copy>
</xsl:template>
请注意,给定示例中注释的值实际上是" d "
,即由空格包围的字符"d"
。
答案 1 :(得分:0)
找到解决方案。这两个xsl:模板可以工作。
<xsl:template match="d[ancestor::b[@c='string1']]" />
<xsl:template match="comment()[contains(.,'d') and ancestor::b[@c='string1']]" />
我不希望在评论文本中使用contains(.,'d')
而是使用相等表达式,但我不知道如何编写该表达式。