0

我正在尝试将标识符引用的 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' 的值不会被复制。我认为我选择了错误的参考节点。我尝试使用“祖先::”和“父::”。那也行不通。你有想法吗?谢谢 我想获得以下结果:

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

1 回答 1

0

XSLT 具有用于解决交叉引用的内置密钥机制。以下样式表:

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>

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

结果

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

PS您的尝试没有成功,因为:

  1. 您引用了对变量的引用;
  2. 您使用Filename而不是FileName.
于 2021-10-12T08:36:13.830 回答