2011-07-01 51 views
3

我需要一些幫助,以解決我無法解決的問題。XPATH按位置選擇返回不一致的結果

我有下面的XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="prueba.xsl"?> 
<ficha> 
<titulo></titulo> 
<bloque> 
    <texto></texto> 
    <pregunta id="1" tipo="checkSN"> 
     <texto>Acredita curso bienestar animal minimo 20 h</texto> 
    </pregunta> 
    <pregunta id="2" tipo="texto"> 
     <texto>Sistemática inspección</texto> 
    </pregunta> 
    <grupo> 
     <texto>trato adecuado enfermos</texto>   
     <pregunta id="3" tipo="desplegableSNP"> 
      <texto>Recetas correspondientes</texto> 
     </pregunta> 
     <pregunta id="4" tipo="multiple"> 
      <texto>Disponen de comida y bebida</texto> 
     </pregunta> 
    </grupo> 
    <grupo> 
     <texto> 
      Heridos/Enfermos 
     </texto> 
     <pregunta id="5" tipo="multiple"> 
      <texto>Se aprecian heridos o enfermos momento inspeccion</texto>    
     </pregunta> 
     <pregunta id="6" tipo="multiple"> 
      <texto>Separados del resto</texto>   
     </pregunta> 
     <pregunta id="7" tipo="multiple"> 
      <texto>Disponen de comida y bebida</texto>   
     </pregunta> 
     <pregunta id="8" tipo="multiple"> 
      <texto>Disponen de comida y bebida</texto>   
     </pregunta> 
    </grupo>   
</bloque> 
<bloque> 
    <texto>Condiciones específicas de alojamiento y manejo</texto> 
</bloque> 
</ficha> 

和folliwng XSL片:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<html> 
    <head> 
     <link rel="stylesheet" type="text/css" href="prueba.css" /> 
    </head> 
    <body> 
    <h2><xsl:value-of select="/ficha/titulo"/></h2> 

    <h3>1: <xsl:value-of select="//pregunta[1]/@id"/></h3> 
    <h3>2: <xsl:value-of select="//pregunta[2]/@id"/></h3> 
    <h3>3: <xsl:value-of select="//pregunta[3]/@id"/></h3> 
    <h3>4: <xsl:value-of select="//pregunta[4]/@id"/></h3> 
    <h3>5: <xsl:value-of select="//pregunta[5]/@id"/></h3> 
    <h3>6: <xsl:value-of select="//pregunta[6]/@id"/></h3> 
    <h3>7: <xsl:value-of select="//pregunta[7]/@id"/></h3> 
    <h3>8: <xsl:value-of select="//pregunta[8]/@id"/></h3> 
    <h3>c: <xsl:value-of select="count(//pregunta)"/></h3> 

    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

當我加載它們我得到這個結果:

1:1 2:2 3:7 4:8 5: 6: 7: 8: c:8

我不明白爲什麼它忽略了一些節點。如果我包含新節點或移動它們,它始終顯示4個結果,從位置5到8的節點它永遠不會顯示任何內容。我需要使用這種類型的選擇,因爲它來自Java應用程序,樣式表僅用於測試。

+0

[XPath查詢獲取元素的第n個實例]的可能重複(http://stackoverflow.com/questions/4007413/xpath-query-to-get-nth-instance-of-an-element) – n611x007

回答

7

//pregunta在括號中。將XPath表達式更改爲(//pregunta)[1]/@id(//pregunta)[2]/@id ...

如果沒有括號,例如//pregunta[4]評估爲位於其父元素第四位置的所有pregunta元素。但是(// pregunta)[4]首先計算所有元素的序列,然後取該序列的第四個元素。

+0

它的工作原理!非常感謝,非常好的解釋,現在我明白爲什麼它不起作用。 – KennyZgz

+0

+1。正確答案。也許保存所有變量並使用它。每次遍歷樹都會很沉重。 –

+0

@Kenny,當你考慮路徑表達式開始處的'//'等價於'/ descendant-or-self :: node()/'時,這會變得更清晰。所以''pregunta [4]''相當於'/ descendant-or-self :: node()/ pregunta [position()= 4]',在這種情況下,更容易看到'position()在其直接的「前同胞」兄弟姐妹中佔據先例。儘管如此,這種看起來模糊不清的現象使我很難預測何時不需要括號,所以我總是使用它們(或@empo所說的變量)。 – LarsH

-1

我不能完全解釋你爲什麼看到你的行爲(我懷疑這可能是一個奇怪的二維數組被返回,但這只是我自己的瘋狂理論),但似乎確實如此一個簡單的解決方法。如果您使用foreach循環(這似乎符合你需要什麼更好的呢,雖然我可能再是錯誤的!),它返回的所有值從選擇,即

<xsl:for-each select="//pregunta"> 
    <h3><xsl:value-of select="position()" /> : <xsl:value-of select="@id" /></h3> 
</xsl:for-each> 
+0

With我可以選擇沒有問題的foreach,我已經在其他樣式表中使用它。問題是我需要通過使用XPath的Java索引直接選擇它們。 – KennyZgz

相關問題