Xml XSLT:当父对象具有属性时移除子对象

Xml XSLT:当父对象具有属性时移除子对象,xml,xslt,Xml,Xslt,我希望在父级具有属性c=string1时删除元素d和注释 输入: <a> <b c="string1"> <!-- d --> <d> <e/> </d> <f/> </b> <b c="string2"> <!-- d --> <d> <e/> </d> <f

我希望在父级具有属性c=string1时删除元素d和注释

输入:

<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:


找到了解决办法。这两个xsl:templates可以工作

<xsl:template match="d[ancestor::b[@c='string1']]" />
<xsl:template match="comment()[contains(.,'d') and ancestor::b[@c='string1']]" />

我不希望在评论文本中使用contains.,'d'而是一个相等的表达式,但我不知道如何编写该表达式。

您可以这样看:

<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。

您想要的相等表达式是。='d’。不要忽略“d”两侧的空格。此外,使用普通路径表达式而不是谓词表达式测试祖先轴上的节点更为传统。例如,match=b[@c='string1']/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>