使用属性创建元素

时间:2018-01-17 09:25:11

标签: xml xslt xslt-2.0

我想通过匹配@pagebreak创建一个元素。 @pagebreak出现在多个父级,如para,table等...

INPUT XML:

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <child1>
            <para>This is first para.</para>
            <para pagebreak="yes">This is second para.</para>
            <para>This is first para.</para>
            <table>
                <tr>
                    <td>first table</td>
                </tr>
            </table>
        </child1>
        <child1>
            <para>This is first para.</para>
            <para>This is second para.</para>
            <para>This is first para.</para>
            <table pagebreak="yes">
                <tr>
                    <td>second table</td>
                </tr>
            </table>
        </child1>
    </root>

当前输出:

<?xml version="1.0" encoding="UTF-8"?>
<article>
    <section>
        <p class="p_1">This is first para.</p>
        <div>
            <pagebreak type="yes"/>
        </div>
        <para>This is second para.</para>
        <p class="p_3">This is first para.</p>
        <table id="tab_1">
            <tr>
                <td>first table</td>
            </tr>
        </table>
    </section>
    <section>
        <p class="p_1">This is first para.</p>
        <p class="p_2">This is second para.</p>
        <p class="p_3">This is first para.</p>
        <div>
            <pagebreak type="yes"/>
        </div>
        <table>
            <tr>
                <td>second table</td>
            </tr>
        </table>
    </section>
</article>

期望的输出:

<?xml version="1.0" encoding="UTF-8"?>
<article>
    <section>
        <p class="p_1">This is first para.</p>
        <div>
            <pagebreak type="yes"/>
        </div>
        <p class="p_2">This is second para.</p>
        <p class="p_3">This is first para.</p>
        <table id="tab_1">
            <tr>
                <td>first table</td>
            </tr>
        </table>
    </section>
    <section>
        <p class="p_1">This is first para.</p>
        <p class="p_2">This is second para.</p>
        <p class="p_3">This is first para.</p>
        <div>
            <pagebreak type="yes"/>
        </div>
        <table id="tab_2">
            <tr>
                <td>second table</td>
            </tr>
        </table>
    </section>
</article>
{p <1}}的

模板应与不使用element/@pagebrake的模板相同。

注意:在输出中,您可以看到:

  • 元素段@pagebrake未转换为 para模板规则。
  • 第二部分<para>This is second para.</para>中的元素表未转换为 表模板规则。

我使用的XSLT:

<table>

1 个答案:

答案 0 :(得分:1)

问题在于您的模板匹配*[@pagebreak]。您应该执行xsl:apply-templates而不是执行xsl:next-match,以便继续匹配当前节点,而不是继续匹配其子节点。

<xsl:template match="*[@pagebreak]">
    <div><pagebreak type="yes"/></div>
    <xsl:next-match />
</xsl:template>

您还需要添加模板以停止输出@pagebreak

<xsl:template match="@pagebreak" />