我使用以下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>
但仍然会返回''
。
那么有什么方法可以解决这个问题吗?
答案 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
这种方式无需导航。