XML合并两个文件不起作用

时间:2018-07-30 13:59:32

标签: xslt-2.0

我知道还有其他与我类似的问题,但是我并不能真正解决我的问题,所以我要向这个很棒的社区寻求我犯错的见解。 我正在尝试合并两个XML文件。

XML1

<root1>
    <element1 id="x">
        <subelement><element-i-want role="blubb">text</element-i-want>
            <element-i-want role="bla">text</element-i-want>
        </subelement>
    </element1>
     <element1 id="y">
        <subelement><element-i-want role="blubb">text</element-i-want>
            <element-i-want role="bla">text</element-i-want>
        </subelement>
    </element1>
</root1>

XML2

<root2>
    <element2 id="y">
        <subelement2>
            <title>
               Text
               </title>
        </subelement2>
    </element2>
</root2>

我想要什么:

<root2>
    <element2 id="y">
        <subelement2>
            <title>
                Text
            </title>
            <newelement2>
                <element-i-want role="blubb">text</element-i-want>
                <element-i-want role="bla">text</element-i-want>
            </newelement>
        </subelement2>
    </element2>
</root2>

元素应该是具有与元素2的id属性匹配的属性id =“ y”的element1的子对象

我如何尝试(XSLT 2.0):

<xsl:variable name="variable" select="document($xml1)/element1"/>

 <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
 </xsl:template>

<xsl:template match="title">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy> 
        <xsl:element name="new-element">
            <xsl:copy-of select="$variable[element/@id=/element2/@id]/subelement//element-i-want"/>
        </xsl:element>       
    </xsl:template>

我得到的是:

<root2>
    <element2 id="y">
        <subelement2>
            <title>
                Text
            </title>
            <newelement2/>
        </subelement2>
    </element2>
</root2>

有人可以告诉我,我哪里出错了?我真的不正确。非常感谢你。

1 个答案:

答案 0 :(得分:0)

我总是会为交叉引用定义一个键,但是要修复您可以使用的路径

<xsl:variable name="variable" select="$doc1/root1/element1"/>

<xsl:template match="title">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy> 
        <xsl:element name="new-element">
            <xsl:copy-of select="$variable[@id = current()/../../@id]/subelement//element-i-want"/>
        </xsl:element>       
</xsl:template>

完整示例位于https://xsltfiddle.liberty-development.net/bdxtqh(当然,在代码中,您可以使用<xsl:param name="doc1" select="document('file1.xml')"/>而不是内联文档)。

使用键,使用文字结果元素和xsl:next-match,可以将代码简化为

<xsl:key name="ref" match="root1/element1" use="@id"/>

<xsl:template match="title">
    <xsl:next-match/>
    <new-element>
        <xsl:copy-of select="key('ref', ../../@id, $doc1)/subelement/element-i-want"/>
    </new-element>
</xsl:template>

完整示例位于https://xsltfiddle.liberty-development.net/bdxtqh/1

在线示例使用XSLT 3,但是如果使用XSLT 2处理器,则只需删除xsl:mode并保留身份转换模板即可。