xml - transformar - xslt ejemplo
Xpath/XSLT: compruebe si el siguiente hermano es un nodo particular (2)
He visto preguntas donde se ha aplicado following-sibling en función del valor de un nodo, pero mi problema está relacionado con el nodo real.
Este es el tipo de XML que tengo:
<Employee>
<Summary>
<A>
<B>
</Summary>
<Elections>
</Elections>
<Employee>
Necesito escribir una condición Xpath de la siguiente manera:
if (NOT(the following sibling(first sibling) of /Employee/Summary is Elections)), then do something.
Actualmente tengo:
<xsl:if test="(not(following-sibling::Employee/Summary[1]=''Earnings''))
<xsl:call-template name="EmployeeRecord"/>
</xsl:if>
Tenga en cuenta que no estoy verificando el valor de un nodo sino el nodo mismo (es decir, el nombre del nodo). Cualquier ayuda en la dirección correcta será muy apreciada.
Necesito escribir una condición Xpath de la siguiente manera:
if (NOT(the following sibling(first sibling) of /Employee/Summary is Elections)), then do something.
Uso :
not(/Employee/Summary/following-sibling::*[1][self::Elections])
La expresión XPath que se especifica como argumento para la función not()
selecciona cualquier elemento Elections
que sea el primer elemento hermano siguiente de cualquier elemento Summary
que sea secundario del elemento superior Employee
.
Si esto no selecciona ningún nodo, la expresión XPath anterior se evalúa como true()
.
Estás en el camino correcto. El following-sibling
eje following-sibling
evalúa desde el nodo de contexto en el paso anterior.
si está buscando el primer elemento que es el siguiente-hermano de
/Employee/Summary
, usaría:/Employee/Summary/following-sibling::*[1]
.Para evaluar si ese primer hermano siguiente es un elemento de
Elections
, puede usar un filtro de predicados adicional[self::Elections]
.- Probando la negación de eso, envuelve todo en
not()
Poniendo todo junto, ajustando su ejemplo:
<xsl:if test="not(/Employee/Summary/following-sibling::*[1][self::Elections])">
<xsl:call-template name="EmployeeRecord"/>
</xsl:if>