我有一个输入作为诗歌的元素。
每一节的第一节都以数字开头。下一节总是以";|;;"开头。下一节也以数字开头。所有诗句在 ;脚注参考为星号。每个脚注文本都从|*;(空格、管道、空格、星号)。
<?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>