XPATH Выбор по позиции возвращает непоследовательные результаты - PullRequest
3 голосов
/ 01 июля 2011

Мне нужна помощь с вопросом, который я не могу понять.

У меня есть следующий 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>

И следующий лист 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, таблица стилей только для тестирования.

Ответы [ 2 ]

7 голосов
/ 01 июля 2011

Положите //pregunta в скобках. Измените выражения XPath на (//pregunta)[1]/@id, (//pregunta)[2]/@id ...

без скобок, например //pregunta[4] оценивает все элементы pregunta, которые находятся на четвертой позиции своего родительского элемента.

Однако (// pregunta) [4] сначала вычисляет последовательность всех элементов pregunta, а затем берет четвертый элемент этой последовательности.

0 голосов
/ 01 июля 2011

Я не могу полностью объяснить, почему вы видите свое поведение (я подозреваю, что это может быть связано с возвращением нечетного 2d-массива, но это только моя собственная дикая теория), но, похоже, есть простой обходной путь. Если вы используете цикл foreach (который, кажется, в любом случае соответствует тому, что вам нужно, хотя я могу снова ошибаться!), Он возвращает все значения из выбора, т. Е.

<xsl:for-each select="//pregunta">
  <h3><xsl:value-of select="position()" /> : <xsl:value-of select="@id" /></h3>
</xsl:for-each>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...