【问题标题】:XML - XSLT - Using attribute from external xml documentXML - XSLT - 使用来自外部 xml 文档的属性
【发布时间】:2018-12-27 14:31:05
【问题描述】:

所以,我有这个 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>

因此,我想做的是使用从第二个(外部)XML 文档中检索到的数据,在第一个输入 XML 文档中添加另一个 &lt;info&gt; 元素,

所以这是我要生成的输出 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 属性。我想要做的是获得name 属性等于第二个(外部)XML 文档中的元素&lt;name&gt; 值的孩子的ID 属性的值。您可以看到我尝试使用两个 &lt;xsl:variables&gt; 来执行此操作,一个 (nameOfChild) 获取外部文件中 &lt;name&gt; 元素的值,然后是第二个 (idOfChild) 获取值来自&lt;child&gt; 元素中的属性ID,该属性的name 值等于nameOfChild 变量值。

有谁知道我该怎么做?因为看起来使用两个变量是行不通的,

谢谢!

亚历山大·哈辛托

【问题讨论】:

    标签: xml xslt saxon xslt-3.0


    【解决方案1】:

    你正在这样做......

    <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"/>  
    

    【讨论】:

    • 请注意,我刚刚修改了我的答案,以展示您如何也可以使用密钥来完成。
    • 我仍然很难理解键背后的逻辑,所以感谢您的替代答案!
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多