xsl:comment不能应用所有子元素?

时间:2017-11-09 06:01:43

标签: xml xpath xslt-2.0

我想评论哪个段落包含'第1段'与输入以及子元素一样。

INPUT:

<root>
    <section>
        <title>aaaa</title>
        <para>para 1 <i>italic</i></para>
    </section>
    <section>
        <title>aaaa</title>
        <para>para 2</para>
    </section>
</root>

XSLT:

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="para[contains(. , 'para 1')]">
    <xsl:comment>
            <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
        </xsl:comment>
</xsl:template>

输出:

<section>
    <title>aaaa</title>
    <!--para 1 italic-->
</section>

所需的输出应该复制所有元素,因为它是注释中的输入:

<section>
    <title>aaaa</title>
    <!--<para>para 1 <i>italic</i></para>-->
</section>

2 个答案:

答案 0 :(得分:1)

您可以使用disable-output-escaping处理此问题

switch

答案 1 :(得分:0)

您需要序列化para元素,然后您可以将其标记放入注释中。使用Saxon 9.8任何版本或Altova 2017 R3或2018使用serialize函数在XSLT 3 / XPath 3中支持序列化:

<xsl:template match="para[contains(. , 'para 1')]">
    <xsl:comment select="serialize(.)"/>        
</xsl:template>

就像

这样的输入
<root>
    <section>
        <title>aaaa</title>
        <para>para 1 <i>italic</i></para>
    </section>
    <section>
        <title>aaaa</title>
        <para>para 2</para>
    </section>
    <section>
        <para>para 1 <i>italic</i> <!-- aa --> </para>
    </section>
</root>

将9.8转换为

<root>
        <section>
                <title>aaaa</title>
                <!--<para>para 1 <i>italic</i></para>-->
        </section>
        <section>
                <title>aaaa</title>
                <para>para 2</para>
        </section>
        <section>
                <!--<para>para 1 <i>italic</i> <!- - aa - -> </para>-->
        </section>
</root>

这与禁用 - 输出 - 转义方法相反,这将尝试为您提供格式良好的结果。我目前不确定如何获得可重新分析的格式。