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

标签 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" 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 文档,我可以使用 document 访问该文档。功能:

<?xml version="1.0" encoding="UTF-8"?>
<person>
    <name>Daisy</name>
    <age>20</age>
    <gender>F</gender>
</person>

所以,我想做的是添加另一个 <info>第一个输入 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 的值 child 的属性 name属性等于元素 <name>第二个(外部)XML 文档中的值。您可以看到我尝试使用两个 <xsl:variables> 来做到这一点,一个 ( nameOfChild ) 获取 <name> 的值外部文件中的元素,然后是第二个元素 ( idOfChild ),它从属性 ID 获取值在 <child>属性 name 的元素值等于 nameOfChild变量值。

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

谢谢!

亚历山大·哈辛托

最佳答案

你正在这样做...

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

但是这是一个相对表达式,因此它正在寻找当前 info 节点下的 parent 节点。您应该这样做,以便它检查整个文档(另请注意您错过了对 child 的引用)。

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

或者,定义一个键

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

然后这样做...

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

关于XML - XSLT - 使用外部 xml 文档中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51422874/

相关文章:

java - apache-tomcat-9.0.0.M10 : Change Context-Path in META-INF/context. xml 不工作

XSLT 在后代节点处分割树

xslt - EXSLT 字符串分词器上下文

xml - 有没有更好的方法来执行以下 XSLT

java - XSLT 转换,如果源中不存在则输出元素,如果存在则保持原样

java - Saxon-9.7-HE 中 SingletonItem 的替代

python - 使用 SOAPpy 将 header 部分添加到 SOAP 请求

android - textview 不居中

python - 即使在 odoo 中创建记录后, ListView 仍为空白

撒克逊 XPath 错误 - "cannot serialize attribute"