gpt4 book ai didi

xslt - 将 XSL 模板应用于两个不同源文件之一时,如何在另一个源文件中引用 "matching"节点?

转载 作者:行者123 更新时间:2023-12-03 15:49:31 25 4
gpt4 key购买 nike

我正在使用 XSLT 转换来自两个不同源 XML 的信息。第一个源中的每个相关节点在第二个源文件中都有一个具有等效“id”属性的节点,其中包含需要合并的额外信息。第二个源中没有匹配项的任何节点都无关紧要,因此第一个源需要驱动结果。

这是问题的简化版本:

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:two="http://www.mycompany.com/schemas/1.0">

<xsl:param name="secondDoc" as="document-node()" />

<xsl:template match="/">
<Employees>
<xsl:apply-templates match="$secondDoc/two:People/two:Person" />
<Employees>
</xsl:template>

<xsl:template match="two:Person">
<Employee>
<xsl:value-of select="/Employees/Employee[@id='@id']/FirstName" />
<xsl:value-of select="two:LastName" />
</Employee>
</xsl:template>

</xsl:stylesheet>

第一个来源:

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
<Employee id="1">
<FirstName>John</FirstName>
</Employee>
</Employees>

第二个来源:

<?xml version="1.0" encoding="UTF-8"?>
<People xmlns="http://www.mycompany.com/schemas/1.0">
<Person id="1">
<LastName>Doe</LastName>
</Person>
</People>

我尝试使用的方法是创建与第二个源使用的命名空间前缀匹配的模板,然后与模板中的等效节点匹配。问题是我不确定如何将 XPath 返回到根模板。当然,value-of 语句会失败。

我尝试过的一种方法是将 xsl:with-param 添加到 xsl:apply-templates> 并将匹配的节点作为变量发送到模板。如果我手动选择一个节点(Employee [1]),这会起作用,但是由于 with-param 似乎没有采用应用模板选择的上下文,我不确定如何将“id”属性联系在一起.

有没有一种方法可以返回到根模板,或者我是不是用错了方法?

编辑:我想到了一个可能的解决方案,尽管它可能不是最干净的。我可以将“Employees”节点作为参数传递给模板,然后匹配模板内特定员工的“id”标签,并使用生成的节点作为引用。在此示例中,这看起来像是传递根节点,但实际上这只是整个 XSL 的一小部分。希望有更简单的方法。

最佳答案

使用变量存储对主输入文档根节点的引用:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:two="http://www.mycompany.com/schemas/1.0">

<xsl:param name="secondDoc" as="document-node()" />

<xsl:variable name="main-root" select="/"/>

<xsl:template match="/">
<Employees>
<xsl:apply-templates match="$secondDoc/two:People/two:Person" />
<Employees>
</xsl:template>

<xsl:template match="two:Person">
<Employee>
<xsl:value-of select="$main-root/Employees/Employee[@id = current()/@id]/FirstName" />
<xsl:value-of select="two:LastName" />
</Employee>
</xsl:template>

</xsl:stylesheet>

然后当然要使用一个键来进行交叉引用:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:two="http://www.mycompany.com/schemas/1.0">

<xsl:param name="secondDoc" as="document-node()" />

<xsl:key name="id" match="Employee" use="@id"/>
<xsl:variable name="main-root" select="/"/>
<xsl:template match="/">
<Employees>
<xsl:apply-templates match="$secondDoc/two:People/two:Person" />
<Employees>
</xsl:template>

<xsl:template match="two:Person">
<Employee>
<xsl:value-of select="key('id', @id, $main-root)/FirstName" />
<xsl:value-of select="two:LastName" />
</Employee>
</xsl:template>

</xsl:stylesheet>

关于xslt - 将 XSL 模板应用于两个不同源文件之一时,如何在另一个源文件中引用 "matching"节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19550848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com