2012-09-10 27 views
23

Soy muy nuevo en xslt, y encontré que puede ser fácil o complejo. Quiero aclarar algunos conceptos. ¿Qué es anterior-hermano y qué es ancestro, después de buscar desde google, encontré la explicación antepasado. y el gráfico de su sitio web es más fácil de entender.Concepto XML XLST anterior-hermano y ancestro

Pero todavía no entiendo que precede-hermanos

<product> 
    <inventory> 
     <drink> 
      <lemonade> 
       <price>$2.50</price> 
       <amount>20</amount> 
      </lemonade> 
      <pop> 
       <price>$1.50</price> 
       <amount>10</amount> 
      </pop> 
     </drink> 
      <service> 
      <address /> 
      <phone /> 
      <delivery> City </delivery> 
      </service>  
     <snack> 
      <chips> 
       <price>$4.50</price> 
       <amount>60</amount> 
      </chips> 
     </snack> 
     <hotfood></hotfood> 
     <totalprice> $15</totleprice> 

    </inventory> 
</product> 

así ¿cómo puedo leer este anterior-sibling :: pop/ancestro :: inventario/TotalPrice

ancestro :: inventario/totalprice = producto \ inventario \ precio total anterior-hermano :: pop - No entiendo este ¿cómo leer todos juntos?

Muchas gracias

Respuesta

61

El-hermano anterior :: eje

El-hermano anterior :: eje es un eje de navegación que incluye todos los elementos de hermanos anteriores al elemento de enfoque. Por "hermano" nos referimos a un elemento diferente que tiene el mismo elemento principal para el elemento de referencia. Por "preceder" nos referimos a un nodo que ocurre antes de la referencia. El orden del eje hermano anterior es el orden inverso del documento. Echar un vistazo a este documento:

<fruit> 
    <banana> 
    <lady-finger-banana/> 
    </banana> 
    <apple/> 
    <pear/> 
    <kiwi/> 
</fruit> 

Si el nodo es el foco de pera, entonces la secuencia anterior-sibling :: * es ...

  1. manzana
  2. plátano

Nota: fruta, pera, lady-finger-banana y kiwi no están en la secuencia.

Así que lo siguiente es cierto:

  1. anterior-sibling :: * [1] es la manzana
  2. anterior-sibling :: * [2] es el plátano
  3. recuento (preceding- sibling :: *) es 2
  4. anterior-sibling :: manzana [1] también es la manzana
  5. anterior-sibling :: plátano [1] es el plátano
  6. anterior-sibling :: * [3] está ausente o el emp secuencia Ty

anterior-sibling :: pop/ancestro :: inventario/TotalPrice Ejemplo

Tenemos que alterar su documento muestra un poco para estudiar útilmente este ejemplo

<product> 
    <inventory> 
     <drink> 
      <lemonade> 
       <price>$2.50</price> 
       <amount>20</amount> 
      </lemonade> 
      <pop> 
       <price>$1.50</price> 
       <amount>10</amount> 
      </pop> 
      <focus-item /> 
     </drink> 
     <totalprice>$15</totalprice> 
    </inventory> 
</product> 

Hagamos decir que el foco está en el elemento de enfoque del elemento. para evaluar la expresión-hermano precedente :: pop/ancestro :: inventario/TotalPrice siga estos pasos

  1. anterior-hermanos :: pop selecciona todos los elementos del estallido anteriores para centrarse-elemento. Esto se evalúa a una secuencia de un nodo.
  2. Para cada elemento de la secuencia de la mano izquierda (sólo un elemento emergente se da la circunstancia), ajuste este elemento como un elemento de enfoque temporal, y evaluar la expresión de la derecha de la/operador que es ...

    ancestor::inventory 
    

    Solo hay un nodo, que es el nodo de inventario ancestral. Por lo tanto, el primer/operador evalúa una secuencia de un nodo de inventario.

  3. Ahora evaluamos el efecto del segundo/y su precio total de expresión del operando de la mano derecha. Para cada elemento en la secuencia de la mano izquierda (solo un nodo de inventario por lo que sucede), establezca esto como un elemento de enfoque temporal y evalúe el precio total.

  4. totalprice es la abreviatura de child :: totalprice. Solo hay un elemento de precio total en el eje secundario del nodo de foco temporal, por lo que el resultado final es una secuencia de un nodo, que es el nodo de precio total.

Entendiendo por Diagramas

Por favor, mire this page para una ilustración de axises.

Aquí hay una copia del diagrama de esa página para previous-sibling ::. En él, el nodo de referencia es Charlie y el nodo del eje anterior-hermano :: está en verde. Es el único tal nodo. enter image description here

+0

muy claro!muchas gracias – olo

+0

@Sean: si tengo el foco en elemento elemento de foco: 'parent :: *' me daría '', 'ancestro :: *' me daría '', '' y ' '. ¿Es eso correcto? Saludos cordiales, Peter (+1 para su buena explicación) – Peter

+0

Sí, eso es correcto. –

2

Precediendo-hermanos se lleva todos los hermanos de elementos que le precedieron en el nivel del nodo actual. A menos que especifique uno o más de los hermanos anteriores con una expresión xpath. Si especifica un hermano anterior precedente con xpath, siempre comienza con 1 entre corchetes.

Ancestro es el primer antecesor coincidente que coincide con la expresión. Por lo tanto, vuelve al árbol de nodos para ver una expresión coincidente según el lugar donde apunta actualmente. Entonces, si estuvo en product/inventory/drink/pop o simplemente/pop, ancestro inventory/totalprice solo busca la ocurrencia frist y solo debe devolver un puntero para apuntar a ese caso coincidente, de lo contrario no apunta a nada y usted Todavía señalará pop.

+0

Muchas gracias por su respuesta. ¿podría obtener un poco más de ejemplos? – olo

3

Ejes útiles para la navegación a través del árbol de nodos. Depende de su problema qué tipo de eje es útil.

La siguiente hoja de estilos muestra la diferencia.

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

    <xsl:template match="snack"> 
     <xsl:variable name="siblings" select="ancestor::node()"/> 
     <debug> 
     <xsl:for-each select="preceding-sibling::node()"> 
       <sibling> 
         <xsl:value-of select="local-name()"/> 
       </sibling> 
     </xsl:for-each> 
     <xsl:for-each select="ancestor::node()"> 
       <ancestor> 
         <xsl:value-of select="local-name()"/> 
       </ancestor> 
     </xsl:for-each> 

     </debug> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:apply-templates select="*"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

buen ejemplo +1 – Peter

Cuestiones relacionadas