2012-01-24 81 views
0

我想下面的消息字符串解析: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> 
+0

的 「消息字符串」 不是XML。它是否顯示一些XML結構的一部分? – mzjn

+0

我已經使用XML更新了我的文章 – user1130511

+0

不幸的是,正如您已經意識到的那樣,XSLT並不是解析非XML數據(如您的)的最佳工具。您選擇遞歸模板是完成此任務的最好方法。 – Nat

回答

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> 
0

我奮力一點點了解您的輸入XML - 沒有它被搞的一團糟編輯。它當然看起來不是格式正確的XML,我沒有看到任何<Row><Col>元素。

然而,這一行看起來錯誤:

<xsl:param name="txt" select="''" /> 

我認爲這應該只是閱讀

<xsl:param name="txt"> 
+0

我用XML更新了我的帖子。 – user1130511