所以我是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标签将出现在标签之外,如错误输出中所示。