如何在 'XREF' 元素中包装 'styled-content' 值
HOW TO WRAP THE 'styled-content' value in 'XREF' ELEMENT
元素'styled-content'有固定的属性@style和@style-type值,这里我们尝试将数字值包装在'xref'元素中,用字符分隔作为',''and','–'。下面是例子:
注意:元素 'styled-content' 属性是固定的,但可以在 'p' 元素上方添加其他元素,例如 'italic' 和 'bold'。这些要素也应保留。此外 'styled-content' 元素可以是不同于 'p'.
的第 2 个父元素
输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§14.19</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§15.39A</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§14A.24</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§14.11, 14.15</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§14.11, 14.15, 14.16</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§14.13–14.18</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§8.3A–8.3F</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§13.44, 14.2–14.6</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§14.31, 14.50, and 14.85</styled-content></p>
</root>
预期输出:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§<xref>14.19</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§<xref>15.39A</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§<xref>14A.24</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>14.11</xref>, <xref>14.15</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>14.11</xref>, <xref>14.15</xref>, <xref>14.16</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>14.13</xref>–<xref>14.18</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>8.3A</xref>–<xref>8.3F</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>13.44</xref>, <xref>14.2</xref>–<xref>14.6</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>14.31</xref>, <xref>14.50</xref>, and <xref>14.85</xref></styled-content></p>
</root>
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="styled-content[@style='internal' and @style-type='Ref-internal' and not(ancestor::book-part[@book-part-type[.='preface']])]">
<xsl:choose>
<xsl:when test="not(contains(.,'chap'))">
<styled-content style-type="{/book-part/book-meta/book-id}">
<xsl:for-each select="tokenize(.,'–')">
<xsl:if test="normalize-space(.)">
<xsl:choose>
<xsl:when test="contains(.,'§§')">
<xsl:text>§§</xsl:text><xref><xsl:value-of select="substring-after(.,'§§')"/></xref>
</xsl:when>
<xsl:when test="contains(.,'§')">
<xsl:text>§</xsl:text><xref><xsl:value-of select="substring-after(.,'§')"/></xref>
</xsl:when>
<xsl:otherwise>
<xsl:if test="not(starts-with(., 'Chapter')) and not(starts-with(., 'Sections'))">
<xsl:text>–</xsl:text>
</xsl:if>
<xsl:choose>
<xsl:when test="starts-with(., 'Sections')">
<xsl:text>Sections </xsl:text><xref><xsl:value-of select="replace(.,'Sections ','')"/></xref>
</xsl:when>
<xsl:otherwise>
<xref><xsl:value-of select="."/></xref>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:for-each>
</styled-content>
</xsl:when>
<xsl:otherwise>
<styled-content style="internal" style-type="Ref-internal">
<xsl:apply-templates/>
</styled-content>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这似乎是 xsl:analyze-string
的工作:
<?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:param name="ref-pattern" as="xs:string">[0-9A-Z]+(\.[0-9A-Z]+)*</xsl:param>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="styled-content[@style = 'internal' and @style-type = 'Ref-internal']/text()">
<xsl:analyze-string select="." regex="{$ref-pattern}">
<xsl:matching-substring>
<xref>
<xsl:value-of select="."/>
</xref>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
元素'styled-content'有固定的属性@style和@style-type值,这里我们尝试将数字值包装在'xref'元素中,用字符分隔作为',''and','–'。下面是例子:
注意:元素 'styled-content' 属性是固定的,但可以在 'p' 元素上方添加其他元素,例如 'italic' 和 'bold'。这些要素也应保留。此外 'styled-content' 元素可以是不同于 'p'.
的第 2 个父元素输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§14.19</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§15.39A</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§14A.24</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§14.11, 14.15</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§14.11, 14.15, 14.16</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§14.13–14.18</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§8.3A–8.3F</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§13.44, 14.2–14.6</styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§14.31, 14.50, and 14.85</styled-content></p>
</root>
预期输出:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§<xref>14.19</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§<xref>15.39A</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§<xref>14A.24</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>14.11</xref>, <xref>14.15</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>14.11</xref>, <xref>14.15</xref>, <xref>14.16</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>14.13</xref>–<xref>14.18</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>8.3A</xref>–<xref>8.3F</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>13.44</xref>, <xref>14.2</xref>–<xref>14.6</xref></styled-content></p>
<p content-type="new">A thorough review of the <bold>trust</bold> instrument (see <styled-content style="internal" style-type="Ref-internal">§§<xref>14.31</xref>, <xref>14.50</xref>, and <xref>14.85</xref></styled-content></p>
</root>
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="styled-content[@style='internal' and @style-type='Ref-internal' and not(ancestor::book-part[@book-part-type[.='preface']])]">
<xsl:choose>
<xsl:when test="not(contains(.,'chap'))">
<styled-content style-type="{/book-part/book-meta/book-id}">
<xsl:for-each select="tokenize(.,'–')">
<xsl:if test="normalize-space(.)">
<xsl:choose>
<xsl:when test="contains(.,'§§')">
<xsl:text>§§</xsl:text><xref><xsl:value-of select="substring-after(.,'§§')"/></xref>
</xsl:when>
<xsl:when test="contains(.,'§')">
<xsl:text>§</xsl:text><xref><xsl:value-of select="substring-after(.,'§')"/></xref>
</xsl:when>
<xsl:otherwise>
<xsl:if test="not(starts-with(., 'Chapter')) and not(starts-with(., 'Sections'))">
<xsl:text>–</xsl:text>
</xsl:if>
<xsl:choose>
<xsl:when test="starts-with(., 'Sections')">
<xsl:text>Sections </xsl:text><xref><xsl:value-of select="replace(.,'Sections ','')"/></xref>
</xsl:when>
<xsl:otherwise>
<xref><xsl:value-of select="."/></xref>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:for-each>
</styled-content>
</xsl:when>
<xsl:otherwise>
<styled-content style="internal" style-type="Ref-internal">
<xsl:apply-templates/>
</styled-content>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这似乎是 xsl:analyze-string
的工作:
<?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:param name="ref-pattern" as="xs:string">[0-9A-Z]+(\.[0-9A-Z]+)*</xsl:param>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="styled-content[@style = 'internal' and @style-type = 'Ref-internal']/text()">
<xsl:analyze-string select="." regex="{$ref-pattern}">
<xsl:matching-substring>
<xref>
<xsl:value-of select="."/>
</xref>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>