Referência a elementos inseridos em um único passe
-
26-09-2019 - |
Pergunta
Estou tentando inserir IDs e referências exclusivas a esses IDs usando um único arquivo XSLT.
Dado o XML:
<Parent>
<Name>Dr Evil</Name>
<Child>
<Name>Scott Evil</Name>
</Child>
</Parent>
E este snippet XSLT após uma transformação de identidade:
<xsl:template match="Parent">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:element name="UID"><xsl:value-of select="generate-id(.)"/></xsl:element>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="Child">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:element name="UID"><xsl:value-of select="generate-id(.)"/></xsl:element>
<xsl:element name="ParentUID"><xsl:value-of select="../UID"/></xsl:element>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
Eu recebo a saída:
<Parent>
<UID>XYZ123</UID>
<Name>Dr Evil</Name>
<Child>
<UID>ABC789</UID>
<ParentUID/> <-- expected <ParentUID>XYZ123</ParentUID>
<Name>Scott Evil</Name>
</Child>
</Parent>
Em outras palavras, o elemento UID que está sendo inserido no pai não é visível quando o elemento parentuid está sendo inserido na criança.
Sei que poderia usar dois passes (duas transformadas), mas estou realmente interessado em tentar fazer isso em um arquivo.
Solução
Tente mudar seu parentUID
elemento para:
<xsl:element name="ParentUID">
<xsl:value-of select="generate-id(parent::Parent)"/>
</xsl:element>
Você também pode remover o xsl:element
:
<ParentUID><xsl:value-of select="generate-id(parent::Parent)"/></ParentUID>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow