Xml 使用查找的XLST

Xml 使用查找的XLST,xml,xslt,lookup,Xml,Xslt,Lookup,我正在尝试将一个XML文档转换为另一个XML文档。我尝试了各种方法,但没有一种方法生成所需的目标XML文档 我有一个假设的输入XML文档,如下所示: <rows> <row> <name>ON</name> <description/> </row> <row> <name>NY</name> <description/> </row> &l

我正在尝试将一个XML文档转换为另一个XML文档。我尝试了各种方法,但没有一种方法生成所需的目标XML文档

我有一个假设的输入XML文档,如下所示:

<rows>
 <row>
  <name>ON</name>
  <description/>
 </row>
 <row>
  <name>NY</name>
  <description/>
 </row>
</rows>

在…上
纽约
我还有两个查找:

<loc:locations>
 <loc:location>
  <loc:code>ON</loc:code>
  <loc:value>Ontario</loc:value>
 </loc:location>
 <loc:location>
  <loc:code>NY</loc:code>
  <loc:value>New York</loc:value>
 </loc:location>
</loc:locations>

<des:descriptions>
 <des:description>
  <des:code>ON</des:code>
  <des:value>Ontario is a province in Canada</des:value>
 </des:description>
 <des:description>
  <des:code>NY</des:code>
  <des:value>New York is a state in the USA</des:value>
 </des:description>
</des:descriptions>

在…上
安大略
纽约
纽约
在…上
安大略省是加拿大的一个省
纽约
纽约是美国的一个州
我希望将输入XML转换为以下目标XML:

<places>
 <place>
  <name>Ontario</name>
  <description>Ontario is a province in Canada</description>
 </place>
 <place>
  <name>New York</name>
  <description>New York is a state in the USA</description>
 </place>
</places>

安大略
安大略省是加拿大的一个省
纽约
纽约是美国的一个州
实现这一点的XSLT是什么?谢谢

这对我来说很有效:


只是为了便于阅读,因为您采用了名称空间约定,所以还可以方便地将所有查找数据保存到单个变量中。还可以使用
current()
访问当前节点的
name
。避免
/

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:loc="http://sample.com/location"
    xmlns:des="http://sample.com/description"
    version="1.0">

    <xsl:variable name="lookup" 
        select="document('locations.xml')/loc:locations/loc:location
        | document('descriptions.xml')/des:descriptions/des:description"/>

    <xsl:template match="rows">
        <places>
            <xsl:apply-templates/>
        </places>
    </xsl:template>

    <xsl:template match="row">
        <place>
            <name>
                <xsl:value-of select="$lookup[loc:code=current()/name]/
                    loc:value"/>
            </name>
            <description>
                <xsl:value-of select="$lookup[des:code=current()/name]/
                    des:value"/>
            </description>
        </place>
    </xsl:template>

</xsl:stylesheet>


@empo下面有一个更完善的变体,请务必查看。谢谢empo,@greghmerrill。你的解决方案非常有效。注意,我必须从loc:locations和des:description中删除名称空间前缀。为了克服“前缀未绑定”错误,我需要在两个查找XML文档的根上声明xmlns属性。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:loc="http://sample.com/location"
    xmlns:des="http://sample.com/description"
    version="1.0">

    <xsl:variable name="lookup" 
        select="document('locations.xml')/loc:locations/loc:location
        | document('descriptions.xml')/des:descriptions/des:description"/>

    <xsl:template match="rows">
        <places>
            <xsl:apply-templates/>
        </places>
    </xsl:template>

    <xsl:template match="row">
        <place>
            <name>
                <xsl:value-of select="$lookup[loc:code=current()/name]/
                    loc:value"/>
            </name>
            <description>
                <xsl:value-of select="$lookup[des:code=current()/name]/
                    des:value"/>
            </description>
        </place>
    </xsl:template>

</xsl:stylesheet>