1

単一のXSLTファイルを使用して、一意のIDとそれらのIDへの参照を挿入しようとしています。

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>

つまり、ParentUID要素が子に挿入されているときは、親に挿入されているUID要素は表示されません。

2つのパス(2つの変換)を使用できることは知っていますが、これを1つのファイルで実行することに非常に熱心です。

4

1 に答える 1

2

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>
于 2010-09-02T04:59:15.247 に答える