XSLT - 根据字符串注释祖父元素

时间:2017-10-24 10:54:31

标签: xml xslt

我的输入就像,

<part type="backmatter">
<section type="index">
<title>Index<target id="page236"/></title>
<section>
<title>A</title>
........
</listing>
</section>
</section>
</part>

输出应该是,

    <part type="backmatter">
<section type="index">
<title>Index<target id="page236"/></title>
<section>
<title>A</title>
........
</listing>
</section>
</section>
</part>

我的xslt就像,

<xsl:template match="part[@type='backmatter']">
<xsl:choose>
<xsl:when test="contains(title[1], 'Index')">
<xsl:text disable-output-escaping="yes">&lt;!--</xsl:text>
<xsl:copy><xsl:apply-templates select="node() | @*"/></xsl:copy>
<xsl:text disable-output-escaping="yes">--&gt;</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:copy><xsl:apply-templates select="node() | @*"/></xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

使用上面提到的xslt时,输出反映为,

    <part type="backmatter">
<!--<section type="index">
<title>Index<target id="page236"/></title>
<section>
<title>A</title>
........
</listing>
</section>
</section>-->
</part>

我们需要评论&#34;部分&#34;元素也是不需要的。但是,我们不需要空元素。

1 个答案:

答案 0 :(得分:1)

我不知道发布的代码如何适用于parttitle个大孩子的<xsl:template match="part[@type='backmatter' and section/title[contains(., 'Index')]]"> <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> <xsl:copy-of select="."/> <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> </xsl:template> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> 元素,但听起来好像你想要

<xsl:mode on-no-match="shallow-copy"/>

<xsl:template match="part[@type='backmatter' and section/title[contains(., 'Index')]]">
   <xsl:comment select="serialize(.)"/>
</xsl:template>

请注意,转移到XSLT 3,例如Saxon 9.8允许你避免禁用输出转义黑客并简单地使用

select min(a_day)
       as from_date
      ,max(a_day)
       as till_date
      ,sum(decode(to_char(a_day,'D')
                 ,1,0
                 ,7,0
                 ,1
                 )
          )
       as wrk_days_count   
from (select trunc(sysdate,'iw') + level - 1
             as a_day
      from dual
      connect by level < 8)
;