Ссылка на вставленные элементы за один проход - PullRequest
1 голос
/ 02 сентября 2010

Я пытаюсь вставить уникальные идентификаторы и ссылки на эти идентификаторы, используя один файл XSLT.

С учетом XML:

<Parent>
  <Name>Dr Evil</Name>
  <Child>
    <Name>Scott Evil</Name>
  </Child>
</Parent>

И этот фрагмент XSLT после преобразования идентичности:

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

Я получаю вывод:

<Parent>
  <UID>XYZ123</UID>
  <Name>Dr Evil</Name>
  <Child>
    <UID>ABC789</UID>
    <ParentUID/>                <-- expected <ParentUID>XYZ123</ParentUID>
    <Name>Scott Evil</Name>
  </Child>
</Parent>

Другими словами, элемент UID, вставляемый в Parent, не виден, когда элемент ParentUID вставляется в Child.

Я знаю, что могу использовать два прохода (два преобразования), но я действительно хочу попробовать сделать это в одном файле.

1 Ответ

2 голосов
/ 02 сентября 2010

Попробуйте изменить элемент parentUID на:

  <xsl:element name="ParentUID">
    <xsl:value-of select="generate-id(parent::Parent)"/>
  </xsl:element>

Вы также можете удалить xsl:element:

  <ParentUID><xsl:value-of select="generate-id(parent::Parent)"/></ParentUID>
...