XML-XSLT-使用外部XML文档中的属性

XML-XSLT-使用外部XML文档中的属性,xml,xslt,saxon,xslt-3.0,Xml,Xslt,Saxon,Xslt 3.0,因此,我有一个XML输入文档: <?xml version="1.0" encoding="UTF-8"?> <parent> <childs> <child ID="10" name="John"/> <child ID="2" name="Marie"/> <child ID="7" name="Joseph"/> <child ID="5"

因此,我有一个XML输入文档:

<?xml version="1.0" encoding="UTF-8"?>
<parent>
    <childs>
        <child ID="10" name="John"/>
        <child ID="2" name="Marie"/>
        <child ID="7" name="Joseph"/>
        <child ID="5" name="Daisy"/>
    </childs>
    <childInfo>
        <info childID="10" name="John" age="15" gender="M"/>
        <info childID="2" name="Marie" age="20" gender="F"/>
        <info childID="7" name="Joseph" age="17" gender="M"/>
    </childInfo>
</parent> 
因此,我想做的是在第一个输入XML文档中添加另一个
元素,使用我从第二个(外部)XML文档中检索的数据

这就是我要生成的输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<parent>
    <childs>
        <child ID="10" name="John"/>
        <child ID="2" name="Marie"/>
        <child ID="7" name="Joseph"/>
        <child ID="5" name="Daisy"/>
    </childs>
    <childInfo>
        <info childID="10" name="John" age="15" gender="M"/>
        <info childID="2" name="Marie" age="20" gender="F"/>
        <info childID="7" name="Joseph" age="17" gender="M"/>
        <child childID="5" name="Daisy" age="20" gender="F"/>
    </childInfo>
</parent>

这是我的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs"
  expand-text="yes"
  version="3.0">

    <xsl:output indent="yes" />

    <xsl:mode on-no-match="shallow-copy"/>

    <xsl:variable name="externalDoc" select="document('externalStack.xml')"/>

    <xsl:template match="parent/childInfo/info[last()]">

    <xsl:variable name="nameOfChild" select="$externalDoc/person/name"/>
    <xsl:variable name="idOfChild" select="parent/childs[@name = $nameOfChild]/@ID"/>  

    <xsl:next-match/>
        <child>
            <xsl:attribute name="childID">
                <xsl:value-of select="$idOfChild" />
            </xsl:attribute>
            <xsl:attribute name="name">
                <xsl:value-of select="$externalDoc/person/name"/>
            </xsl:attribute>
            <xsl:attribute name="age">
                <xsl:value-of select="$externalDoc/person/age"/>
            </xsl:attribute>
             <xsl:attribute name="gender">
                <xsl:value-of select="$externalDoc/person/gender"/>
            </xsl:attribute>
        </child>
    </xsl:template>

</xsl:stylesheet>

我可以访问所有数据字段。问题在于
childID
属性。我想做的是获取子元素的
ID
属性的值,该子元素的
name
属性等于第二个(外部)XML文档中的元素
值。您可以看到,我尝试使用两个
,一个(
nameOfChild
)获取外部文件中
元素的值,然后是第二个(
idOfChild
),它从
元素中的属性
ID
获取值,该属性的
name
值等于
nameOfChild
变量值

有人知道我怎么做吗?因为使用两个变量似乎不起作用

谢谢大家!

Alexandre Jacinto

您正在这样做

<xsl:variable name="idOfChild" select="parent/childs[@name = $nameOfChild]/@ID"/> 
或者,定义一个键

<xsl:key name="childs" match="child" use="@name" />

这样做

<xsl:variable name="idOfChild" select="key('childs', $nameOfChild)/@ID"/>  


注意,我刚刚修改了我的答案,向大家展示了如何使用钥匙。我仍然很难理解钥匙背后的逻辑,因此感谢您提供的备选答案!
<xsl:key name="childs" match="child" use="@name" />
<xsl:variable name="idOfChild" select="key('childs', $nameOfChild)/@ID"/>