在 XSLT 1.0 中,如何从由竖线分隔的段落字符串创建元素



我有一个输入作为诗歌的元素。

每一节的第一节都以数字开头。下一节总是以";|;;"开头。下一节也以数字开头。所有诗句在 ;脚注参考为星号。每个脚注文本都从|*;(空格、管道、空格、星号)。

<?xml version="1.0" encoding="UTF-8"?>
<VeseText>1 Lorem ipsum dolor sit amet
 | enim fermentum id taciti porttitor,*
 | dis vitae sagittis aenean id**
 | rhoncus. | 2 Fusce tellus a eu, tempus dapibus,
 | Cras in tincidunt quisque aenean,
 | gravida proin. | 3 Ante a mauris non velit felis,
 | Cras in tincidunt quisque aenean,
 | Scelerisque donec nunc vestibulum.
 | *Id 24  **Cras
</VeseText>

我想将所有行转换为具有适当标记的独立元素。我知道这看起来是一个简单的问题。但我真的不知道怎么做。请帮帮我!

<?xml version="1.0" encoding="UTF-8"?>
<VeseText>
    <First>1 Lorem ipsum dolor sit amet</First>
    <Next>enim fermentum id taciti porttitor,</Next>
    <Next>dis vitae sagittis aenean id**</Next>
    <Next>rhoncus.</Next>
    <First>2 Fusce tellus a eu, tempus dapibus,<First>
    <Next>Cras in tincidunt quisque aenean,<First>
    <Next>gravida proin.<Next>
    <First>3 Ante a mauris non velit felis,</First>
    <Next>Cras in tincidunt quisque aenean,</Next>
    <Next>Scelerisque donec nunc vestibulum.</Next>
    <Footnote>*Id 24  **Cras</Footnote>
</VeseText>

这样试试:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="VerseText">
    <Stanza>
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text" select="."/>
        </xsl:call-template>
  </Stanza>
 </xsl:template>
<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="' | '"/>
        <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
        <xsl:if test="$token">
            <xsl:variable name="first-char" select="substring($token, 1, 1)" />
            <xsl:variable name="elem-name">
            <xsl:choose>
                <xsl:when test="contains('123456789', $first-char)">First</xsl:when>
                <xsl:when test="$first-char='*'">Footnote</xsl:when>
                <xsl:otherwise>Next</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
            <xsl:element name="{$elem-name}">
                <xsl:value-of select="$token"/>
            </xsl:element>
        </xsl:if>
        <xsl:if test="contains($text, $delimiter)">
            <!-- recursive call -->
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            </xsl:call-template>
        </xsl:if>
</xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新