2013-04-24 103 views
0

我有一個近似表格佈局(從程序輸出)的xml源 - a是表格標題,b是列標題d,c是行和e是行單元格:使用當前節點的位置來訪問另一個節點的值

<?xml version="1.0" encoding="utf-16"?> 
    <a> 
    <b> 
     <d/> 
     <d/> 
     <d/> 
    </b> 
     <c> 
     <e/> 
      <e/> 
     <e/> 
     </c> 
    </a> 
</xml> 

我寫了下面的xsl:

<?xml version="1.0" encoding="UTF-16"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 

<xsl:template match="/"> 
    <Lessons> 
    <xsl:for-each select="//c"> 
     <xsl:call-template name="lesson" /> 
    </xsl:for-each> 
    </Lessons> 
</xsl:template> 


<xsl:template name="lesson"> 
    <Lesson> 
     <Teacher> 
      <xsl:value-of select="count(./preceding-sibling::*)+1" /> 
      <xsl:value-of select="//b[count(./preceding-sibling::*)+1]" /> 
     </Teacher> 
    </Lesson> 
</xsl:template> 

</xsl:stylesheet> 

第一個XSL:價值的教師元素給了我正確的價值觀。我希望第二個xsl:value-of返回該單元格標題的值,即第一個調用模板的e元素返回第一個d元素,等等。但是,它輸出所有d元素的價值。

回答

0

即使它不完全清楚你的期望,我會嘗試一個答案。
正如我理解你喜歡找到與<e>元素具有相同位置的<d>元素。

這可能是將當前位置作爲變量獲取的。

preceding-sibling

<xsl:value-of select="//b/d[(count(current()/preceding-sibling::*)+1)]/@id" /> 

更新下面的部分

xsl:variable name ="pos" select="position()" /> 
<xsl:value-of select="//b/d[position() = $pos]/@id" /> 

或使用次數是因爲從「全能喬治」的評論而改變。

請注意position()的結果取決於調用上下文。

例如以下測試XSLT(1.0版):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <Lessons> 
      <!-- Wrong result with position --> 
      <xsl:for-each select="//c/e"> 
       <xsl:call-template name="lesson" /> 
      </xsl:for-each> 
     </Lessons> 
     <Lessons2> 
      <!-- Wonted result even with position --> 
      <xsl:for-each select="//c"> 
       <xsl:for-each select="e"> 
        <xsl:call-template name="lesson" /> 
       </xsl:for-each> 
      </xsl:for-each> 
     </Lessons2> 
    </xsl:template> 

    <xsl:template name="lesson"> 
     <Lesson> 
      <Teacher> 
       <xsl:value-of select="@id" /> 
       <xsl:text>,</xsl:text> 
       <xsl:value-of select="count(./preceding-sibling::*)+1" /> 
       <xsl:text>,</xsl:text> 
       <xsl:variable name ="pos" select="position()" /> 
       <xsl:value-of select="$pos" /> 
       <xsl:text>,</xsl:text> 
       <xsl:value-of select="//b/d[position() = $pos]/@id" /> 
       <xsl:text>,</xsl:text> 
       <xsl:value-of select="//b/d[count(current()/preceding-sibling::*)+1]/@id" /> 
      </Teacher> 
     </Lesson> 
    </xsl:template> 

</xsl:stylesheet> 

利用該輸入:

<?xml version="1.0" encoding="utf-16"?> 
<xml> 
    <a> 
     <b> 
      <d id="d1"/> 
      <d id="d2"/> 
      <d id="d3"/> 
     </b> 
     <c> 
      <e id="e1"/> 
      <e id="e2"/> 
      <e id="e3"/> 
     </c> 
     <c> 
      <e id="e21"/> 
      <e id="e22"/> 
      <e id="e23"/> 
     </c> 
     <c> 
      <e id="e21"/> 
      <e id="e22"/> 
      <e id="e23"/> 
     </c> 
    </a> 
</xml> 

生成此輸出:

<Lessons> 
    <Lesson> 
    <Teacher>e1,1,1,d1,d1</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e2,2,2,d2,d2</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e3,3,3,d3,d3</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e21,1,4,,d1</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e22,2,5,,d2</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e23,3,6,,d3</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e21,1,7,,d1</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e22,2,8,,d2</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e23,3,9,,d3</Teacher> 
    </Lesson> 
</Lessons><Lessons2> 
    <Lesson> 
    <Teacher>e1,1,1,d1,d1</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e2,2,2,d2,d2</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e3,3,3,d3,d3</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e21,1,1,d1,d1</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e22,2,2,d2,d2</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e23,3,3,d3,d3</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e21,1,1,d1,d1</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e22,2,2,d2,d2</Teacher> 
    </Lesson> 
    <Lesson> 
    <Teacher>e23,3,3,d3,d3</Teacher> 
    </Lesson> 
</Lessons2> 
+0

使用位置()適用於這個例子,但是對於更加擴展的情況,position()獲得了點頭的值e在rtf而不是原始文檔中,因此如果存在多個c元素,則會發生故障 – 2013-04-25 08:09:44

+0

但是,做的伎倆。爲了澄清其他用戶,重要的因素是將count()函數放在()中 - 這樣函數的值就以數字形式返回,而不是作爲函數返回。如果它作爲函數返回,則會被忽略,結果返回d []的值 - 解釋我第一次得到的多個值。 – 2013-04-25 08:13:03

+0

很高興我能幫到你。 (即使我第一次沒有正確閱讀請求;對此感到抱歉)。但我認爲你的解釋是不正確的。不是括號「()」是「竅門」(也應該在沒有它們的情況下工作)。無效的是使用'current()'而不是dot「。」('[count(./ preceding-sibling :: * )+1]')應該這樣做。 – 2013-04-25 08:42:11

相關問題