【问题标题】:Get Element from another XML file, based on an element value from current XML根据当前 XML 中的元素值从另一个 XML 文件中获取元素
【发布时间】:2018-04-19 12:15:10
【问题描述】:

我使用以下 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>

我现在想提取job 元素的id 属性,并由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] 是空的,因为它在 other_XML.xml 中查找title 元素,而它当然没有。

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

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

但这仍然返回''

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

【问题讨论】:

  • 您的“other_XML.xml”格式不正确。您有一个开始的&lt;berufeliste &gt; 标记,但有一个结束的&lt;list&gt; 标记。我猜你已经开始翻译标签了,但还没有完全完成......
  • 哦,是的,这是我的错。我想快速翻译它,这样元素就不是德语了。对此感到抱歉。

标签: xml xslt xpath xquery


【解决方案1】:

假设你在一个匹配JobPost的模板中,你想要的表达式是this....

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

所以current()/title 为当前的JobPost 节点选择title 元素,而不是表达式中的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" />

【讨论】:

  • 非常感谢!使用current()normalize-space() 解决了这个问题。
【解决方案2】:

当您想读取&lt;job&gt; 中的@id 时,将所有过滤器放在一个谓词中就足够了:

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

这样就不需要导航了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多