2011-12-01 52 views
1

我正在使用以下樣式表在Excel數據工作簿中顯示錶格。我無法得到所需的結果,而是顯示爲與下面給出的不同。XSL:使用for循環中的標記化問題

建議您需要?

使用的樣式表:

<xsl:stylesheet> 
<xsl:template match="/"> 
    <xsl:variable name="test1" select="str:tokenize('1$,$2$,$3$,$4$,$5','$,$')" /> 
    <xsl:variable name="test2" select="str:tokenize('a$,$b$,$c$,$d$,$e','$,$')" /> 
    <xsl:for-each select="str:split('1a$,$2b$,$3c$,$4d$,$5e','$,$')> 
     <row> 
      <cell Index="1"> 
       <xsl:value-of select="$test1[position()]" /> 
      </cell> 
      <cell Index="2"> 
       <xsl:value-of select="$test2[position()]" /> 
      </cell> 
     </row> 
    </xsl:for-each> 
</xsl:template> 

預期結果:

2 B

3c中

4 d

5e中

凡爲顯示爲

A B結果

Çd

Ë

這似乎是它顯示的最新記號化的值。 如何獲得尊重的價值。

+0

你能認罪se爲我們提供了一個更完整的樣式表?你在綁定到'str'的​​命名空間中使用函數,但是我們不知道它們來自哪裏。您是否使用Java的擴展函數?一些在線資源的自定義功能? –

+0

str是一個命名空間,它引用了「http://exslt.org/strings」 – Bugude

回答

2

好問題,+1。

在我看來,與其的

<xsl:value-of select="$test1[position()]" /> 

這一定是

<xsl:value-of select="$test1[position() = current()]" /> 

一模一樣的觀察適用於第二<xsl:value-of>

說明

任何表達式

$var[position()] 

相當於:

$var 

因爲position()只能具有值> = 1和[position()]裝置position()布爾值,並且根據定義,任何非負數的布爾值是true()

如果我們要在XPath 1中選擇節點集$ var中的第$ k個節點。0,這是弱類型和它不知道該$k保持的整數,我們必須寫:

$var[position() = $k] 

這裏是一個完整的,對應的XSLT 2.0溶液

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:variable name="test1" select= 
     "tokenize('1$,$2$,$3$,$4$,$5','\$,\$')" /> 

     <xsl:variable name="test2" select= 
     "tokenize('a$,$b$,$c$,$d$,$e','\$,\$')" /> 

     <xsl:for-each select="tokenize('1a$,$2b$,$3c$,$4d$,$5e','\$,\$')"> 
      <row> 
       <cell Index="1"> 
        <xsl:value-of select="$test1[position()]" /> 
       </cell> 
       <cell Index="2"> 
        <xsl:value-of select="$test2[position()]" /> 
       </cell> 
      </row> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

當任何XML文檔(忽略)應用中,想要的東西,正確的結果產生

<row xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <cell Index="1">1 2 3 4 5</cell> 
    <cell Index="2">a b c d e</cell> 
</row> 
<row xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <cell Index="1">1 2 3 4 5</cell> 
    <cell Index="2">a b c d e</cell> 
</row> 
<row xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <cell Index="1">1 2 3 4 5</cell> 
    <cell Index="2">a b c d e</cell> 
</row> 
<row xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <cell Index="1">1 2 3 4 5</cell> 
    <cell Index="2">a b c d e</cell> 
</row> 
<row xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <cell Index="1">1 2 3 4 5</cell> 
    <cell Index="2">a b c d e</cell> 
</row> 
+0

在循環中,Position()作爲計數器,因爲tokenize根據分隔符分割字符串並將結果分解爲節點集,我們可以使用position()作爲索引來從節點集 – Bugude

+0

中獲取指定的值,這對我來說不起作用。當我嘗試打印令牌的值時,我總是得到test2值,而不是test1和test2各自的值。 – Bugude

+0

@Bugude:查看我的問題的更新。我不太清楚EXSLT函數的規格,但在標準的XPath 2.0中,'$'字符必須作爲'\ $'轉義。 –