在 XSLT 1.0 中,如何从由竖线和
In XSLT 1.0, How do I create elements from a string of paragraphs separated by pipes and
我输入的是带有诗句的元素。
每一节的第一节都以数字开头。下一节总是从“|”开始,下一节也从数字开始。所有诗句都由
脚注参考是星号。每个脚注文本都从 | * (space,pipe,space,asterisk).
开始
<?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>
我输入的是带有诗句的元素。
每一节的第一节都以数字开头。下一节总是从“|”开始,下一节也从数字开始。所有诗句都由 脚注参考是星号。每个脚注文本都从 | * (space,pipe,space,asterisk).
开始<?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>