【问题标题】:Referencing inserted elements in a single pass在单遍中引用插入的元素
【发布时间】:2010-09-02 04:46:00
【问题描述】:

我正在尝试使用单个 XSLT 文件插入唯一 ID 和对这些 ID 的引用。

给定 XML:

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

身份转换后的这个 XSLT sn-p:

<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 元素被插入到 Child 中时,插入到 Parent 中的 UID 元素是不可见的。

我知道我可以使用两次传递(两次转换),但我真的很想尝试在一个文件中执行此操作。

【问题讨论】:

  • 除了 DevNull 的正确答案,我看到您正在尝试从结果树中选择节点。请记住,这不会发生。

标签: xslt unique transform identifier


【解决方案1】:

尝试将您的 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>

【讨论】:

  • 完美运行!我现在看到 generate-id 总是如何解析给定元素的相同 id。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
相关资源
最近更新 更多