Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 从两个相关xml文件中获取节点值_Xpath_Xquery_Altova - Fatal编程技术网

Xpath 从两个相关xml文件中获取节点值

Xpath 从两个相关xml文件中获取节点值,xpath,xquery,altova,Xpath,Xquery,Altova,我是Xquery的初学者,我有一个xml代码,我想用另一个文件依赖两个不同的xml文件 <library> <Book> <title>Title1</title> <author>Ellizabith</author> </Book> <Book> <title>Title2</title> <author>

我是Xquery的初学者,我有一个xml代码,我想用另一个文件依赖两个不同的xml文件

<library>
   <Book>
     <title>Title1</title>
     <author>Ellizabith</author>
   </Book>
   <Book>
     <title>Title2</title>
     <author>Sam</author>
   </Book>
   <Book>
    <title>Title3</title>
    <author>Ryan</author>
   </Book>
</library>
Book.xml

<library>
   <Book>
     <title>Title1</title>
     <author>Ellizabith</author>
   </Book>
   <Book>
     <title>Title2</title>
     <author>Sam</author>
   </Book>
   <Book>
    <title>Title3</title>
    <author>Ryan</author>
   </Book>
</library>
如果你使用

<library>
   <Book>
     <title>Title1</title>
     <author>Ellizabith</author>
   </Book>
   <Book>
     <title>Title2</title>
     <author>Sam</author>
   </Book>
   <Book>
    <title>Title3</title>
    <author>Ryan</author>
   </Book>
</library>
let $books := <library>
   <Book>
     <title>Title1</title>
     <author>Ellizabith</author>
   </Book>
   <Book>
     <title>Title2</title>
     <author>Sam</author>
   </Book>
   <Book>
    <title>Title3</title>
    <author>Ryan</author>
   </Book>
</library>
let $authors := <authorRoot>
   <author>
    <Name>Rayan</Name>
     <Location>Yahoo</Location>
    </author>
    <author>
      <Name>Syan</Name>
      <Location>Google</Location>
    </author>
    <author>
      <Name>Sam</Name>
      <Location>Bing</Location>
     </author>
     <author>
         <Name>Ellizabith</Name>
         <Location>Apple</Location>
    </author>
    </authorRoot>
    return $authors/author[Name = $books/Book[contains(title, 'Title1')]/author]/Location/string()
let$books:=
标题1
伊丽莎白
标题2
山姆
标题3
赖安
让$authors:=
拉扬
雅虎
锡安
谷歌
山姆
宾
伊丽莎白
苹果
返回$authors/author[Name=$books/Book[contains(title,'Title1')]/author]/Location/string()

结果是苹果电脑出现了许多小问题

<library>
   <Book>
     <title>Title1</title>
     <author>Ellizabith</author>
   </Book>
   <Book>
     <title>Title2</title>
     <author>Sam</author>
   </Book>
   <Book>
    <title>Title3</title>
    <author>Ryan</author>
   </Book>
</library>
  • 作者和书籍XML文件中的名称不匹配。我想这只是一些打字错误
  • 谓词属于轴步骤,而不是它们自己的步骤(删除第一行
    book
    后面的斜杠)
  • XML和XQuery区分大小写<代码>使用大写字母B,因此在XQuery中也使用同样的方法,同样在第1行中
  • 在第二行中,您将遍历所有
    元素。改用
    authoroot/author
  • 在第三行中,您隐藏了这本书
    $p
    ,其中包含该FLWOR表达式其余部分的名称,但您希望在第五行中再次使用这本书。最好使用另一个变量名
  • 如果不需要,最好不要使用
    子代或self
    -步骤
    /
    (第一行和第二行)。这会降低性能
  • 我不明白你在第三行到第五行中对过滤的想法是什么。将您自己与此工作解决方案进行比较。此外,我还使用了变量名,不要把自己和不必要的短名称混淆

    <library>
       <Book>
         <title>Title1</title>
         <author>Ellizabith</author>
       </Book>
       <Book>
         <title>Title2</title>
         <author>Sam</author>
       </Book>
       <Book>
        <title>Title3</title>
        <author>Ryan</author>
       </Book>
    </library>
    
    用相应的
    doc(…)
    函数替换
    $book
    $authors

    <library>
       <Book>
         <title>Title1</title>
         <author>Ellizabith</author>
       </Book>
       <Book>
         <title>Title2</title>
         <author>Sam</author>
       </Book>
       <Book>
        <title>Title3</title>
        <author>Ryan</author>
       </Book>
    </library>
    
    用于$books//library/book中的$book[标题/包含(,'Title1')]
    对于$authors//authorRoot/author中的$author
    其中$book/author=$author/Name
    返回$author/Location/text()
    
    如果您想有一个不同位置的列表,请将
    不同的值(…)
    环绕所有四行

    <library>
       <Book>
         <title>Title1</title>
         <author>Ellizabith</author>
       </Book>
       <Book>
         <title>Title2</title>
         <author>Sam</author>
       </Book>
       <Book>
        <title>Title3</title>
        <author>Ryan</author>
       </Book>
    </library>
    
    没有显式循环的替代方案:

    <library>
       <Book>
         <title>Title1</title>
         <author>Ellizabith</author>
       </Book>
       <Book>
         <title>Title2</title>
         <author>Sam</author>
       </Book>
       <Book>
        <title>Title3</title>
        <author>Ryan</author>
       </Book>
    </library>
    
    $authors/authorRoot/author[
    Name=$books/library/Book[contains(title,'Title1')]/author)
    ]/位置
    

    第二个解决方案也是有效的XPath 1.0,第一个解决方案需要XPath 3.0或XQuery处理器。

    您尝试了什么?回答这些问题有很多问题,请查找XQuery和join。如果您有一些代码,但有问题,我们很乐意提供帮助。堆栈溢出不是为了不费吹灰之力就完成作业。@JensErat请查看我的代码。我现在加上去好多了。对于一个完美的问题,还包括您收到的错误消息。阅读有关。谢谢@jens Erat我很少在那里问问题寻求帮助
    <library>
       <Book>
         <title>Title1</title>
         <author>Ellizabith</author>
       </Book>
       <Book>
         <title>Title2</title>
         <author>Sam</author>
       </Book>
       <Book>
        <title>Title3</title>
        <author>Ryan</author>
       </Book>
    </library>