XSLT:XML元素属性出现在元素之外

时间:2016-10-20 17:50:47

标签: xml xslt

所以我是XSLT的新手,老老实实地发现它们非常令人困惑。当前输入XML的样式如下:

<chapter prev_label="5">
    <title>Chapter Title</title>
    <section prev_label="5.1">
        <title>Section 5.1 Title
            <indexterm>
                <primary>index1a</primary>
                <secondary>index1b</secondary>
            </indexterm>
        </title>
        <para>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vel hendrerit urna. Pellentesque non ante ac felis ullamcorper scelerisque ut vitae tellus. Cras a auctor nulla, a faucibus leo. Fusce iaculis purus         tempor. quis tincidunt mattis. Nunc elit ex, ultrices quis tincidunt vitae, efficitur eu quam. Curabitur mollis egestas
        </para>
        <subsection prev_label="5.1.1">
            <title>Subsection 5.1.1 Title
                <indexterm>
                    <primary>index2a</primary>
                    <secondary>index2b</secondary>
                </indexterm>
            </title>
            <seqlist>
                <item prev_label="1.">ucibus ullamcorper sit amet neclibero.</item>
                <item prev_label="2.">Fusce a tortor bibendum, iaculis mi vitae.</item>
            </seqlist>
        </subsection>
    </section>
</chapter>

我想要的输出如下:

<section prev_label="5.1">
    <title>Section 5.1 Title
    </title>
    <para>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vel hendrerit urna. Pellentesque non ante
        ac felis ullamcorper scelerisque ut vitae tellus. Cras a auctor nulla, a faucibus leo. Fusce iaculis purus
        tempor. quis tincidunt mattis. Nunc elit ex, ultrices quis tincidunt vitae, efficitur eu quam. Curabitur mollis egestas
    </para>
    <subsection prev_label="5.1.1">
        <title>Subsection 5.1.1 Title
        </title>
        <seqlist>
            <item prev_label="1.">ucibus ullamcorper sit amet nec libero.</item>
            <item prev_label="2.">Fusce a tortor bibendum, iaculis mi vitae.</item>
        </seqlist>
    </subsection>
</section>

任何部分/子部分都可以包含seqlist标签,para标签或两者。我希望那些保留在我的结果输出中,同时删除所有indexterm标签及其子项。我遇到的另一个问题是基于我运行的应用程序用户将选择只是部分,或部分和子部分。在所有情况下,所有“子”子部分都应显示在输出中。因此,如果选择了5.1节,则应显示5.1节以及以5.1开头的所有小节。如果选择了第5.1.1小节,则将显示以5.1.1开头的所有小节。小节的最低范围是4位数(即5.1.1.4)。我希望这是有道理的。因为我们的REST调用方式被格式化为具有初始XML工作的后端,所以我们有两个.xsl文件,一个用于section,一个用于subsection。如果用户选择一个部分,则应用XSL部分,如果用户选择一个子部分,则应用子部分XSL。 (即www.restserver.com/book/5/5.1会选择一个部分,www.restserver.com / book / 5 / 5.1 / 5.1.1会选择该部分)

部分XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="sectionId"/>
<xsl:template match="chapter">
    <sectionBody>
        <xsl:apply-templates select="section"/>
    </sectionBody>
</xsl:template>
<xsl:template match="section">
    <xsl:apply-templates select="section[@prev_label=$sectionId]"/>
</xsl:template>
<xsl:template match="section[@prev_label=$sectionId]">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="title">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()[not(self::indexterm)]"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="*">
    <xsl:copy-of select="."/>
</xsl:template>

小节XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="subsectionId"/>
<xsl:template match="chapter">
    <subsectionBody>
        <xsl:apply-templates select="section"/>
    </subsectionBody>
</xsl:template>
<xsl:template match="section">
    <xsl:apply-templates select="subsection"/>
</xsl:template>
<xsl:template match="subsection">
    <xsl:apply-templates select="subsection[@prev_label=$subsectionId]"/>
</xsl:template>
<xsl:template match="subsection[starts-with(@prev_label,$subsectionId)]">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="title">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()[not(self::indexterm)]"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="*">
    <xsl:copy-of select="."/>
</xsl:template>

我遇到的问题是由于某种原因(我确信显然有些人比我更精通XSL),部分和子部分的prev_label属性正在被拉出来?我的输出目前看起来像这样:

<sectionBody>
    <section>5.1
        <title>Section 5.1 Title
        </title>
        <para>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vel hendrerit urna. Pellentesque non ante
        ac felis ullamcorper scelerisque ut vitae tellus. Cras a auctor nulla, a faucibus leo. Fusce iaculis purus
        tempor. quis tincidunt mattis. Nunc elit ex, ultrices quis tincidunt vitae, efficitur eu quam. Curabitur
        mollis egestas
        </para>
        <subsection>5.1.1
            <title>Subsection 5.1.1 Title
            </title>
            <seqlist>
            <item prev_label="1.">ucibus ullamcorper sit amet nec libero.</item>
            <item prev_label="2.">Fusce a tortor bibendum, iaculis mi vitae.</item>
            </seqlist>
        </subsection>
    </section>
</sectionBody>

我尝试的所有内容都没有在正确的位置使用prev_label属性,或者带回了不需要的标签。我有一种感觉,两个xsl文件互相踩踏,但我不能完全解决这个问题。我不确定它是否相关,但如果用户只选择一个部分,则子部分标签将正确输出,但是部分prev_label标签将出现在标签之外,如错误输出中所示。

0 个答案:

没有答案