Necesito obtener todos los VERS (0 y 1) de:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<LIB xmlns:p1="http://www.w3.org/2001/XMLSchema-instance">
  <BOOK bnumber="1">
    <CHAPTER cnumber="1">
      <VERS vnumber="1">0</VERS>
      <VERS vnumber="2">1</VERS>
    </CHAPTER>
  </BOOK>
</LIB>

intenté con esta plantilla XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="LIB">
<xsl:for-each select="BOOK">
<xsl:for-each select="CHAPTER"> 
<xsl:value-of select="VERS"/>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Pero solo obtuve los primeros VERS (0).

¿Cómo podría for-each? Basado en la presencia de vnumber, pero ¿cómo?

Si conoce una buena fuente en inglés simple, estoy dispuesta a aprender.

1
user8036224 14 jun. 2017 a las 20:04

2 respuestas

La mejor respuesta

Estaba utilizando, esencialmente, uno for-each muy pocos. Hay múltiples VERS es, por lo que debe iterar sobre ellos.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:for-each select="LIB">
      <xsl:for-each select="BOOK">
        <xsl:for-each select="CHAPTER">
          <xsl:for-each select="VERS[@vnumber]">
            <xsl:value-of select="."/>
          </xsl:for-each>
        </xsl:for-each>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Sin embargo, todos estos pueden colapsarse en uno for-each si usa XPath correctamente.

Aquí le mostramos cómo iterar sobre todos los VERS que tienen un atributo vnumber:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:for-each select="LIB/BOOK/CHAPTER/VERS[@vnumber]">
      <xsl:value-of select="." />
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Nota al margen: creo que debería estudiar cómo usar plantillas en XSLT. Suponiendo que desea hacer algo con los LIB, los LIBROS y los CAPÍTULOS, las plantillas son la forma de hacerlo en lugar de tener una pirámide profundamente anidada como en el primer ejemplo anterior.

2
JLRishe 14 jun. 2017 a las 17:23

En XSLT 1.0, la instrucción xsl:value-of devuelve el valor de cadena de solo el nodo primero en el conjunto de nodos seleccionado.

Pruebe en su lugar algo como:

<xsl:template match="/">
    <xsl:for-each select="LIB/BOOK/CHAPTER/VERS">
        <xsl:value-of select="." />
    </xsl:for-each>
</xsl:template>

No publicó el resultado esperado, por lo que no estoy seguro de cómo desea separar los valores devueltos.

0
michael.hor257k 14 jun. 2017 a las 17:22