根据当前XML的元素值从另一个XML文件中获取Element

时间:2018-04-19 12:15:10

标签: xml xslt xpath xquery

我使用以下XSLT代码从另一个XML文件中提取元素列表:

<xsl:variable name="titleCodes" select="document('other_XML.xml')/list"/>

other_XML.xml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="struktur_berufe.xsd">
    <job id="15339" bkz="B 01104-101">
        <type>t</type>
        <name>
            <name_nl>Job a</name_nl>
        </name>
    </job>
    <job>
        ...
    </job>
    ...
</list>

我现在想要提取id元素的job属性,由name_nl元素过滤。我过滤的值来自我试图转换的XML文件,如下所示:

<JobPost>
    <id>1</id>
    <title>
        Job a    <!-- value I filter by -->
    </title>
</JobPost>

这是我到目前为止所尝试的内容:

<TitleCode>
    <xsl:value-of select="$titleCodes/job[type='t']/name[name_nl=title]/ancestor::job/@id"/>
</TitleCode> 

然而,问题似乎是,[name_nl=title]为空,因为它会在title中查找other_XML.xml元素,但它当然没有。{1}}。

我也试过使用这样的变量:

<TitleCode>
    <xsl:variable select="title" name="ab"/>
    <xsl:value-of select="$titleCodes/job[type='t']/name[name_nl=$ab]/ancestor::job/@id"/>
</TitleCode> 

但仍然会返回''

那么有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

假设您在匹配JobPost的模板中,您想要的表达式是....

<xsl:value-of select="$titleCodes/job[type='t']/name[name_nl = current()/title]/ancestor::job/@id"/>

因此current()/title选择当前title节点的JobPost元素,而不是表达式中的name节点。

如果这不起作用,可能是因为你的XML中的title节点中有空格,所以试试这个......

 <xsl:value-of select="$titleCodes/job[type='t']/name[name_nl = normalize-space(current()/title)]/ancestor::job/@id"/>

这可能是因为第二次使用变量而导致问题的空白区域。

请注意,您也可以编写这样的表达式,以删除表达式中ancestor的使用

<xsl:value-of select="$titleCodes/job[type='t'][name/name_nl = normalize-space(current()/title)]/@id" />

答案 1 :(得分:0)

如果您想阅读@id中的<job>,那么将所有过滤器放在一个谓词中就足够了:

job[type='t' and name/name_nl=$ab]/@id

这种方式无需导航。