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.

Foi útil?

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
scroll top