使用引用将节点的值复制到其他节点

Copy value of node using reference into other node

我正在尝试将标识符引用的 XML 节点的值复制到图中的另一个节点。 原始文件如下所示:

<Root>
<Object id="Id1">
    <FileName>file.png</FileName>
</Object>
<Description>
    <Content>
        <Title>Nice Object</Title>
        <ObjectReference>Id1</ObjectReference>
    </Content>
</Description></Root>

在XSLT中,我使用一个变量来标识引用节点标识符的值。

<xsl:template match="Content">
<xsl:variable name="IdObject">
    <xsl:value-of select="ObjectReference"/>
</xsl:variable>
<Out>
    <Title>
        <xsl:value-of select="Title"/>
    </Title>
    <FileName>
        <xsl:value-of select="//Object[@id='$IdObject']/Filename"/>
    </FileName>
</Out></xsl:template>

'FileName' 的值未被复制。我 select 错误的引用节点,我想。我尝试使用 'Ancestor::' 和 'Parent::'。那也不管用。 你有好主意吗? 谢谢 我想获得以下结果:

<Out>
    <Name>Nice Object</Name>
    <FileName>file.png</FileName>
</Out>

XSLT 有一个内置的 key 机制来解析交叉引用。以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="obj" match="Object" use="@id" />

<xsl:template match="Content">
    <Out>
        <xsl:copy-of select="Title"/>
        <xsl:copy-of select="key('obj', ObjectReference)/FileName"/>
    </Out>
</xsl:template>

<xsl:template match="text()"/>

</xsl:stylesheet>

应用于您的输入示例,将 return:

结果

<?xml version="1.0" encoding="UTF-8"?>
<Out>
  <Title>Nice Object</Title>
  <FileName>file.png</FileName>
</Out>

P.S。您的尝试没有成功,因为:

  1. 您引用了变量的引用;
  2. 您使用了 Filename 而不是 FileName