我正在尝试解析以下消息字符串:
"Row 1> testdata1 |Row 5> testdata2 |Row 7> testdata3"
转换为HTML表格格式:
<tr>
<td>Row 1</td><td>testdata1</td>
<td>Row 5</td><td>testdata2</td>
<td>Row 7</td><td>testdata3</td>
</td>
这是我目前的尝试:
<xsl:template match="Row">
<tbody><xsl:apply-templates/></tbody>
</xsl:template>
<xsl:template match="col1" >
<xsl:call-template name="parseStr" >
<xsl:with-param name="txt" select="text()" />
</xsl:call-template>
</xsl:template>
<xsl:template name="parseStr">
<xsl:param name="txt" select="''" />
<tr><xsl:choose>
<xsl:when test="contains($txt, '>')" >
<td><xsl:value-of select="substring-before($txt, '>')" /></td><td><xsl:value-of select="substring-after($txt, '>')" /></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="$txt" /></td>
</xsl:otherwise>
</xsl:choose></tr>
<xsl:variable name="leftStr" select="substring-after($txt, '|')" />
<xsl:if test="string-length($leftStr)>1" >
<xsl:call-template name="parseStr" >
<xsl:with-param name="txt" select="$leftStr" />
</xsl:call-template>
</xsl:if>
</xsl:template>
此XSLT提供了正确的表结构。我在初始&gt;之后分离testdata字符串时遇到困难。打破。
输出:
<tr>
<td>Row 1</td><td>testdata1 |Row 5> testdata2 |Row 7> testdata3</td>
<td>Row 5</td><td>testdata2 |Row 7> testdata3</td>
<td>Row 7</td><td>testdata 3</td>
</tr>
更新 我已经想出如何抓住字符串之间的文本。我添加了以下内容:
<td><xsl:value-of select="substring-before($txt, '>')" /></td><td><xsl:value-of select="substring-after(substring-before($txt, '|'), '>')" /></td>
但是,我错过了最后解析的消息“testdata3”。
此外,这是原始的XML:
<Rowsets>
<Rowset>
<Row>
<col1>Row 1> testdata1 |Row 5> testdata2 |Row 7> testdata3</col1>
</Row>
</Rowset>
</Rowsets>
更新2:
成功!我想出了解决方案;然而,可能有一种更简单/更清洁的方式......如果您有兴趣,这里是我的解决方案: - )
<xsl:template name="parseStr">
<xsl:param name="txt" select="''" />
<tr><xsl:choose>
<xsl:when test="contains($txt, '|')" >
<td><xsl:value-of select="substring-before($txt, '>')" /></td><td><xsl:value-of select="substring-after(substring-before($txt, '|'), '>')"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="substring-before($txt, '>')" /></td><td><xsl:value-of select="substring-after($txt, '>')" /></td>
</xsl:otherwise>
</xsl:choose></tr>
<xsl:variable name="leftStr" select="substring-after($txt, '|')" />
<xsl:if test="string-length($leftStr)>1" >
<xsl:call-template name="parseStr" >
<xsl:with-param name="txt" select="$leftStr" />
</xsl:call-template>
</xsl:if>
</xsl:template>
答案 0 :(得分:4)
<强>予。这个XSLT 1.0转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="text()" name="makeTDs">
<xsl:param name="pStr" select="."/>
<xsl:if test="string($pStr)">
<xsl:variable name="vText" select="concat($pStr, ' |')"/>
<xsl:variable name="vPair" select=
"substring-before($vText, ' |')"/>
<td>
<xsl:value-of select="substring-before($vPair, '> ')"/>
</td>
<td>
<xsl:value-of select="substring-after($vPair, '> ')"/>
</td>
<xsl:call-template name="makeTDs">
<xsl:with-param name="pStr" select=
"substring-after($pStr, ' |')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
应用于此XML文档:
<t>Row 1> testdata1 |Row 5> testdata2 |Row 7> testdata3</t>
生成想要的正确结果:
<tr>
<td>Row 1</td>
<td>testdata1</td>
<td>Row 5</td>
<td>testdata2</td>
<td>Row 7</td>
<td>testdata3</td>
</tr>
<强> II。 XSLT 2.0解决方案:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<tr>
<xsl:for-each select="tokenize(., ' \|')">
<xsl:for-each select="tokenize(., '> ')">
<td><xsl:sequence select="."/></td>
</xsl:for-each>
</xsl:for-each>
</tr>
</xsl:template>
</xsl:stylesheet>
此转换在应用于同一XML文档(上图)时会产生相同的正确结果:
<tr>
<td>Row 1</td>
<td>testdata1</td>
<td>Row 5</td>
<td>testdata2</td>
<td>Row 7</td>
<td>testdata3</td>
</tr>
答案 1 :(得分:0)
我正在努力理解你的输入XML - 它是否被编辑搞砸了。它当然似乎不是格式良好的XML,我没有看到任何<Row>
或<Col>
元素。
然而,这一行看起来不对:
<xsl:param name="txt" select="''" />
我认为它应该只是阅读
<xsl:param name="txt">