【发布时间】:2019-09-09 09:32:27
【问题描述】:
在转换此元素时发生在多个位置<p content-type="paratext">paratext 2_1</p>
XML 输入:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<p content-type="heading-01">heading-01</p>
<p content-type="paratext">paratext 1</p>
<p content-type="paratext">paratext 1</p>
<p content-type="heading-01">heading-01</p>
<p content-type="heading-02">heading-02</p>
<p content-type="paratext">paratext 2_1</p>
<p content-type="heading-02">heading-02</p>
<p content-type="paratext">paratext 2_2</p>
<p content-type="heading-01">heading-01</p>
<p content-type="paratext">paratext 3</p>
<p content-type="paratext">paratext 3</p>
<p content-type="heading-01">heading-01</p>
<p content-type="paratext">paratext 4</p>
<p content-type="paratext">paratext 4</p>
</body>
要求的输出:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<sec sec-type="heading-01">
<title>heading-01</title>
<p content-type="paratext">paratext 1</p>
<p content-type="paratext">paratext 1</p>
</sec>
<sec sec-type="heading-01">
<title>heading-01</title>
<sec sec-type="heading-02">
<title>heading-02</title>
<p content-type="paratext">paratext 2_1</p>
</sec>
<sec sec-type="heading-02">
<title>heading-02</title>
<p content-type="paratext">paratext 2_2</p>
</sec>
</sec>
<sec sec-type="heading-01">
<title>heading-01</title>
<p content-type="paratext">paratext 3</p>
<p content-type="paratext">paratext 3</p>
</sec>
<sec sec-type="heading-01">
<title>heading-01</title>
<p content-type="paratext">paratext 4</p>
<p content-type="paratext">paratext 4</p>
</sec>
</body>
当前输出:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<sec sec-type="heading-01">
<title>heading-01</title>
<p content-type="paratext">paratext 1</p>
<p content-type="paratext">paratext 1</p>
</sec>
<sec sec-type="heading-01">
<title>heading-01</title>
<sec sec-type="heading-02">
<title>heading-02</title>
<p content-type="paratext">paratext 2_1</p>
</sec>
<p content-type="paratext">paratext 2_1</p>
<sec sec-type="heading-02">
<title>heading-02</title>
<p content-type="paratext">paratext 2_2</p>
</sec>
<p content-type="paratext">paratext 2_2</p>
</sec>
<sec sec-type="heading-01">
<title>heading-01</title>
<p content-type="paratext">paratext 3</p>
<p content-type="paratext">paratext 3</p>
</sec>
<sec sec-type="heading-01">
<title>heading-01</title>
<p content-type="paratext">paratext 4</p>
<p content-type="paratext">paratext 4</p>
</sec>
</body>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="body">
<body>
<xsl:for-each select="p[@content-type = 'heading-01']">
<sec sec-type="{@content-type}">
<title>
<xsl:value-of select="."/>
</title>
<xsl:apply-templates select="following-sibling::node() except (following-sibling::p[@content-type = ('heading-01', 'referencetitle')], following-sibling::p[@content-type = ('heading-01', 'referencetitle')]/following-sibling::node())"/>
</sec>
</xsl:for-each>
</body>
</xsl:template>
<xsl:template match="p[@content-type = 'heading-02']">
<sec sec-type="{@content-type}">
<title>
<xsl:value-of select="."/>
</title>
<xsl:apply-templates select="following-sibling::node() except (following-sibling::p[@content-type = ('heading-01', 'heading-02', 'referencetitle')], following-sibling::p[@content-type = ('heading-01', 'heading-02', 'referencetitle')]/following-sibling::node())"/>
</sec>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
您可以在当前输出中看到
paratext 2_1和paratext 2_2在第 2 节和第 1 节中也有多个。它应该只包裹在第 2 部分而不是 1
标签: xml xslt xslt-2.0 xslt-grouping