我知道还有其他与我类似的问题,但是我并不能真正解决我的问题,所以我要向这个很棒的社区寻求我犯错的见解。 我正在尝试合并两个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>
有人可以告诉我,我哪里出错了?我真的不正确。非常感谢你。
答案 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
并保留身份转换模板即可。