我有下面的xml。
XML文档
以及下面的xslt。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ntw="Number2Word.uri" exclude-result-prefixes="ntw">
<xsl:variable name="ThisDocument" select="document('')"/>
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
<html>
<head>
<title>
<xsl:value-of select="concat('Appendix ', substring-before(substring-after(part/chapter/title, ' '),' '))"></xsl:value-of>
</title>
<link rel="stylesheet" href="C:Documents and Settingsu0138039DesktopXML COnversionBook 5Book-5(original)assetsmain.css" type="text/css"/>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="part/chapter/title">
<xsl:variable name="check">
<xsl:value-of select="string-length(substring-before(substring-after(.,' '),' '))"/>
</xsl:variable>
<section class="tr_chapter">
<div class="cha_app chapter">
<xsl:choose>
<xsl:when test="$check=1">
<a name="{concat('CHA_APP_0', substring-before(substring-after(., ' '),' '))}" class="tr_toc_anchor"> </a>
</xsl:when>
<xsl:otherwise>
<a name="{concat('CHA_APP_', substring-before(substring-after(., ' '),' '))}" class="tr_toc_anchor"> </a>
</xsl:otherwise>
</xsl:choose>
<div class="chapter-title">
<xsl:value-of select="concat('Appendix ', substring-before(substring-after(., ' '),' '))"></xsl:value-of>
</div>
<div class="chapter-subtitle">
<xsl:value-of select="substring-after(substring-after(.,' '),' ')"></xsl:value-of>
</div>
<div class="chapter-subtitle">
<xsl:value-of select="following-sibling::subtitle"/>
</div>
<xsl:apply-templates select="following-sibling::section"/>
</div>
</section>
</xsl:template>
<xsl:template match="section">
<div class="section-sect1">
<a name="{concat('APP_01-SEC-',substring-before(substring-after(./title,' '), ' '))}">
</a>
<div class="section-title">
<xsl:value-of select="concat('Chapter ',substring-before(substring-after(./title,' '),' '),' ')"/>
<xsl:text disable-output-escaping="yes"><br/></xsl:text>
<xsl:value-of select="substring-after(substring-after(./title,' '),' ')"/>
</div>
<xsl:apply-templates select="child::node()[not(self::title)]"/>
</div>
</xsl:template>
<xsl:template match="para">
<div class="para">
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template name="orderedlist" match="orderedlist">
<ol class="eng-orderedlist orderedlist">
<xsl:apply-templates/>
</ol>
</xsl:template>
<xsl:template name="orderitem" match="item">
<li class="item">
<xsl:apply-templates/>
</li>
</xsl:template>
<xsl:template name="orderitempara" match="item/para">
<xsl:choose>
<xsl:when test="parent::item/@num">
<div class="para">
<xsl:choose>
<xsl:when test="position()=1">
<span class="item-num">
<xsl:if test="position()=1">
<xsl:value-of select="parent::item[1]/@num"/>
</xsl:if>
</span>
<xsl:text> </xsl:text>
<xsl:apply-templates/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</div> </xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="content-style">
<xsl:choose>
<xsl:when test="@format='smallcaps'">
<xsl:value-of select="translate(normalize-space(.),'ABCDEFGHIJKLMNOPQRSTUVWXZ','abcdefghijklmnopqrstuvwxyz')"/>
</xsl:when>
<xsl:when test="@format='superscript'">
</xsl:when>
<xsl:otherwise>
<xsl:variable name="fontStyle">
<xsl:value-of select="concat('font-style-',@font-style)"/>
</xsl:variable>
<span class="{$fontStyle}">
<xsl:apply-templates/>
</span>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
当我在xml上运行这个xslt时。内容是重复的,尽管我没有使用任何循环。我真的很困惑,无法理解我哪里出了问题。请告诉我。
您可以使用此文本搜索"制定本法是为了确保经济纠纷得到公正和及时的仲裁,以保护"
感谢
因为没有用于部分和章节的显式模板,所以元素的默认模板是激发,这相当于调用将模板应用于元素的子级。
您确实有一个明确的部分/章节/标题模板,其中包括以下章节元素的应用模板说明。由于这些小节元素是章节的子元素,这意味着您要处理每个小节两次。结果就是你看到的重复。
XSLT的相关部分的一个稍微更惯用的公式可能看起来更像这样:
首先,生成"section"one_answers"div"元素,它们将输出中的一章封装在"chapter"的模板中。
<xsl:template match="part/chapter">
<section class="tr_chapter">
<div class="cha_app chapter">
<xsl:apply-templates/>
</div>
</section>
</xsl:template>
现在,部分/章节/标题的模板不需要负责后面的章节,也不需要负责副标题。(我也把你的测试改成了看起来更合理的测试——但你可能有理由像你那样制定它。)
<xsl:template match="part/chapter/title">
<xsl:choose>
<xsl:when test="not(normalize-space(.))">
<a name="{concat('CHA_APP_0',
substring-before(substring-after(., ' '),' '))}"
class="tr_toc_anchor"> </a>
</xsl:when>
<xsl:otherwise>
<a name="{concat('CHA_APP_',
substring-before(
substring-after(., ' '),' '))}"
class="tr_toc_anchor"> </a>
</xsl:otherwise>
</xsl:choose>
<div class="chapter-title">
<xsl:value-of select="concat('Appendix ',
substring-before(
substring-after(., ' '),' '))"/>
</div>
<div class="chapter-subtitle">
<xsl:value-of select="substring-after(
substring-after(.,' '),' ')"/>
</div>
</xsl:template>
现在字幕处理简单,在复杂的选择中不需要跳过。
<xsl:template match="part/chapter/subtitle">
<div class="chapter-subtitle">
<xsl:apply-templates/>
</div>
</xsl:template>