【问题标题】:Recursion in XSLT 2XSLT 2 中的递归
【发布时间】:2016-04-05 06:23:19
【问题描述】:

我想添加一个属性 type="bottom line" 到其下一个兄弟有表格注释条目的行,我做到了..但问题是如果有合并的列我必须添加 type="bottom行”也添加到该条目,并且当条目数相等时,此添加应停止。

输入 XML

<table>
    <row>
        <entry id="1"></entry>
        <entry id="2"></entry>
        <entry id="3" merged="1"></entry>
        <entry id="4"></entry>
        <entry id="5"></entry>
    </row>
    <row>
        <entry id="1"></entry>
        <entry id="2"></entry>
        <entry id="3" merged="1"></entry>
        <entry id="4"></entry>
        <entry id="5"></entry>
    </row>
    <row>
        <entry id="6" merged="1"></entry>
        <entry id="7"></entry>
        <entry id="8"></entry>
        <entry id="9"></entry>
    </row>

    <row>
        <entry id="10"></entry>
        <entry id="11"></entry>
        <entry id="12"></entry>
        <entry id="13"></entry>

        <entry id=“14"></entry>

    </row>
    <row>
        <entry id="15"></entry>
        <entry id="16"></entry>
        <entry id="17"></entry>
    </row>
    <row>
        <entry type="table notes">test</entry>
        <entry type="table notes">test</entry>
        <entry type="table notes">test</entry>
    </row>
</table>

预期输出

<table>
    <row>
        <entry id="1"></entry>
        <entry id="2"></entry>
        <entry id="3" merged="1"></entry>
        <entry id="4"></entry>
        <entry id="5"></entry>
    </row>
    <row>
        <entry id="1"></entry>
        <entry id="2"></entry>
        <entry id="3" merged="1" type="bottom line"></entry>
        <entry id="4"></entry>
        <entry id="5"></entry>
    </row>
    <row>
        <entry id="6" merged="1" type="bottom line"></entry>
        <entry id="7"></entry>
        <entry id="8"></entry>
        <entry id="9"></entry>
    </row>

    <row>
        <entry id="10"></entry>
        <entry id="11"></entry>
        <entry id="12"></entry>
        <entry id="13"></entry>

        <entry id="14"></entry>

    </row>
    <row>
        <entry id="15" type="bottom line"></entry>
        <entry id="16" type="bottom line"></entry>
        <entry id="17" type="bottom line"></entry>
    </row>
    <row>
        <entry type="table notes">test</entry>
        <entry type="table notes">test</entry>
        <entry type="table notes">test</entry>
    </row>
</table>

到目前为止我写的 XSLT:

  • 用于在表格注释中添加底线

    底线

合并条目

<xsl:template match="row/entry[@merged]" mode="merged">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:attribute name="type">bottom line</xsl:attribute>
        <xsl:apply-templates/>
    </xsl:copy>
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="row[last()-1]">
    <xsl:if test="count(./entry) &gt; count(./preceding-sibling::row/entry)">
        <xsl:apply-templates mode="merged"/>
    </xsl:if>
</xsl:template>

请帮我解决这个问题。 谢谢..

【问题讨论】:

    标签: xml xpath xslt-2.0


    【解决方案1】:

    XSLT:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xsl:output method="xml" indent="yes"/>
        <!-- identity transform template -->
        <xsl:template match="@* | node()">
            <xsl:copy>
                <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
        </xsl:template>
        <!-- change the desired elements -->
        <xsl:template match="row[following-sibling::*[1]/entry/@type = 'table notes']/entry | entry[@merged]">
            <xsl:copy>
                <xsl:apply-templates select="@*"/>
                <xsl:attribute name="type">bottom line</xsl:attribute>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
    

    第一个模板是身份转换模板,用于复制所有属性和节点。 第二个模板将@type 添加到所需的元素中。

    【讨论】:

    • 这里,键入底线添加到所有条目[@merged],但我想限制这一点。当当前行条目计数等于前一行条目计数时,不应添加此属性。有没有关于@Lingamurthy 的想法。
    • @user2490093 我不明白。你能解释一下吗。您的预期输出是否包含您的评论?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2013-06-03
    相关资源
    最近更新 更多