xml - XQuery - 使用一个值访问另一个值

标签 xml xquery

我想从 XML 文档中提取所有懂英语的指南的名称,问题是我不知道如何做。我使用 XQuisitor 查询 XML 文档。

片段:

<GuideLang>
<guideID>1</guideID>
<lname>English</lname>
</GuideLang>
<GuideLang>
<guideID>2</guideID>
<lname>German</lname>
</GuideLang>
<GuideLang>
<guideID>3</guideID>
<lname>Swedish</lname>
</GuideLang>
<Guide>
<guideID>1</guideID>
<gname>John Smith</gname>
</Guide>
<Guide>
<guideID>2</guideID>
<gname>Weber Schneider</gname>
</Guide>

我知道:

 element Result {
 //GuideLang[lname='English']
 }

给我有关语言和指南 ID 的所有信息 - 但我如何使用该 ID 仅从指南节点打印指南的名称?

谢谢!

最佳答案

使用这个纯 XPath 2.0 表达式:

/*/Guide
   [for $gid in guideID
     return ../GuideLang[guideID eq $gid and lname eq 'English']
   ]
    /gname

这假定提供的文档片段的节点是(未提供的)XML 文档的(未提供的)顶级元素的子元素。

这甚至可以转换为 XPath 1.0 表达式(注意没有使用 //!):

/*/Guide
    [guideID
    =
     ../GuideLang[lname = 'English']/guideID
    ]
     /gname

更新:

只是为了让那些惊讶于上面的第一个表达式是纯 XPath 2.0 的人,这里是一个完整的基于 XSLT 2.0 的验证:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     <xsl:sequence select=
     "/*/Guide
           [for $gid in guideID
             return ../GuideLang[guideID eq $gid and lname eq 'English']
           ]
            /gname
     "/>
 </xsl:template>
</xsl:stylesheet>

当此 XSLT 2.0 转换应用于以下文档时(提供的片段,包装在顶部元素中):

<t>
    <GuideLang>
        <guideID>1</guideID>
        <lname>English</lname>
    </GuideLang>
    <GuideLang>
        <guideID>2</guideID>
        <lname>German</lname>
    </GuideLang>
    <GuideLang>
        <guideID>3</guideID>
        <lname>Swedish</lname>
    </GuideLang>
    <Guide>
        <guideID>1</guideID>
        <gname>John Smith</gname>
    </Guide>
    <Guide>
        <guideID>2</guideID>
        <gname>Weber Schneider</gname>
    </Guide>
</t>

计算 XPath 2.0 表达式并输出正确选择的节点:

<gname>John Smith</gname>

关于xml - XQuery - 使用一个值访问另一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8415958/

相关文章:

sql-server - 在sql server 2012中读取具有动态行和属性的xml

xpath - 选择多个值并使用XQuery或XPath比较它们?

xml - XQuery:何时使用 data() 函数?

java - 将 Context.xml 放在 WAR 文件中的什么位置?

python - 使用 dicttoxml 模块从字典生成时,xml 字符串包含在 b'<xml_string>' 中

xml - 如何在 golang 中编码 CDATA 与使用换行符输入数据相同

android - 隐藏工具栏布局线

sql-server - SQL Server 表中的类型化 XML 更新

xml - XQuery(或 XPath)是否具有 Update、Insert 和 Delete 以及 Select 的等价物?

html - 返回多元素 HTML 作为 xquery 结果