我想下面的消息字符串解析:XSLT +解析字符串
"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提供了正確的表結構。在初始>中斷後,我很難分開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>
UPDATE 我已經想通了如何抓住文本其間的字符串。我添加了以下內容:
<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>
的 「消息字符串」 不是XML。它是否顯示一些XML結構的一部分? – mzjn
我已經使用XML更新了我的文章 – user1130511
不幸的是,正如您已經意識到的那樣,XSLT並不是解析非XML數據(如您的)的最佳工具。您選擇遞歸模板是完成此任務的最好方法。 – Nat