XSLT:父项具有属性时删除子项

时间:2017-04-11 20:47:34

标签: xml xslt

我希望在父级具有属性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>

2 个答案:

答案 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')而是使用相等表达式,但我不知道如何编写该表达式。