Xpath将字段从一个项添加到另一个具有引用id的项

Xpath将字段从一个项添加到另一个具有引用id的项,xpath,Xpath,这是我需要导入的文件的结构 <channel> <item> <type>image</type> <title>title image</title> <id>1</id> <image_url>url_to_image</image_url> </item> <item> <type>page</type>

这是我需要导入的文件的结构

<channel>
<item>
  <type>image</type>
  <title>title image</title>
  <id>1</id>
  <image_url>url_to_image</image_url>
</item>

<item>
  <type>page</type>
  <title>node title</title>
  <id>2</id>
  <ref>
    <entity>image_ref</entity>
    <ref_value>1</ref_value>
  </ref>
  <ref>
    <entity>category</entity>
    <ref_value>5</ref_value>
  </ref>
  </item>
</channel>

形象
标题图像
1.
url\u到\u图像
页
节点标题
2.
图像参考
1.
类别
5.
在页面项中,标记包含图像项的id。 如何将图像url从图像项添加到页面项? 我想用

/channel/item[id=ref/ref\u value[../entity/text()='image\u ref']]/image\u url
但它不起作用

什么XPath表达式不导入图像项而只导入页面项

提前感谢

使用

  /*/item[type='image' and id=../item[type='page']
           /ref[entity = 'image_ref']/ref_value]
                     /image_url/text()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[type='image' and id=../item[type='page']
               /ref[entity = 'image_ref']/ref_value]
                         /image_url/text()"/>
 </xsl:template>
</xsl:stylesheet>
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>2</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][1]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
url_to_image
url2_to_image
基于XSLT的验证

  /*/item[type='image' and id=../item[type='page']
           /ref[entity = 'image_ref']/ref_value]
                     /image_url/text()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[type='image' and id=../item[type='page']
               /ref[entity = 'image_ref']/ref_value]
                         /image_url/text()"/>
 </xsl:template>
</xsl:stylesheet>
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>2</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][1]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
url_to_image
url2_to_image
更新

  /*/item[type='image' and id=../item[type='page']
           /ref[entity = 'image_ref']/ref_value]
                     /image_url/text()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[type='image' and id=../item[type='page']
               /ref[entity = 'image_ref']/ref_value]
                         /image_url/text()"/>
 </xsl:template>
</xsl:stylesheet>
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>2</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][1]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
url_to_image
url2_to_image
OP在评论中暗示可能有许多“页面项”和“图像项”,他需要一个表达式,只获取特定页面的图像url

此XPath表达式

  /*/item[type='image' and id=../item[type='page']
           /ref[entity = 'image_ref']/ref_value]
                     /image_url/text()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[type='image' and id=../item[type='page']
               /ref[entity = 'image_ref']/ref_value]
                         /image_url/text()"/>
 </xsl:template>
</xsl:stylesheet>
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>2</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][1]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
url_to_image
url2_to_image
为以下XML文档中的第一个“页面项”生成所需的图像url:

url_to_image
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>2</id>
        <image_url>url2_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>3</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>4</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>2</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][2]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
要获取第二个页面项所需的url,只需将上述XPath表达式修改为:

url_to_image
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>2</id>
        <image_url>url2_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>3</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>4</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>2</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][2]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
现在结果是

  /*/item[type='image' and id=../item[type='page']
           /ref[entity = 'image_ref']/ref_value]
                     /image_url/text()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[type='image' and id=../item[type='page']
               /ref[entity = 'image_ref']/ref_value]
                         /image_url/text()"/>
 </xsl:template>
</xsl:stylesheet>
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>2</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][1]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
url_to_image
url2_to_image
使用

  /*/item[type='image' and id=../item[type='page']
           /ref[entity = 'image_ref']/ref_value]
                     /image_url/text()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[type='image' and id=../item[type='page']
               /ref[entity = 'image_ref']/ref_value]
                         /image_url/text()"/>
 </xsl:template>
</xsl:stylesheet>
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>2</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][1]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
url_to_image
url2_to_image
基于XSLT的验证

  /*/item[type='image' and id=../item[type='page']
           /ref[entity = 'image_ref']/ref_value]
                     /image_url/text()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[type='image' and id=../item[type='page']
               /ref[entity = 'image_ref']/ref_value]
                         /image_url/text()"/>
 </xsl:template>
</xsl:stylesheet>
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>2</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][1]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
url_to_image
url2_to_image
更新

  /*/item[type='image' and id=../item[type='page']
           /ref[entity = 'image_ref']/ref_value]
                     /image_url/text()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[type='image' and id=../item[type='page']
               /ref[entity = 'image_ref']/ref_value]
                         /image_url/text()"/>
 </xsl:template>
</xsl:stylesheet>
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>2</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][1]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
url_to_image
url2_to_image
OP在评论中暗示可能有许多“页面项”和“图像项”,他需要一个表达式,只获取特定页面的图像url

此XPath表达式

  /*/item[type='image' and id=../item[type='page']
           /ref[entity = 'image_ref']/ref_value]
                     /image_url/text()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[type='image' and id=../item[type='page']
               /ref[entity = 'image_ref']/ref_value]
                         /image_url/text()"/>
 </xsl:template>
</xsl:stylesheet>
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>2</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][1]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
url_to_image
url2_to_image
为以下XML文档中的第一个“页面项”生成所需的图像url:

url_to_image
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>2</id>
        <image_url>url2_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>3</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>4</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>2</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][2]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
要获取第二个页面项所需的url,只需将上述XPath表达式修改为:

url_to_image
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>2</id>
        <image_url>url2_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>3</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>4</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>2</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][2]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
现在结果是

  /*/item[type='image' and id=../item[type='page']
           /ref[entity = 'image_ref']/ref_value]
                     /image_url/text()
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/*/item[type='image' and id=../item[type='page']
               /ref[entity = 'image_ref']/ref_value]
                         /image_url/text()"/>
 </xsl:template>
</xsl:stylesheet>
<channel>
    <item>
        <type>image</type>
        <title>title image</title>
        <id>1</id>
        <image_url>url_to_image</image_url>
    </item>
    <item>
        <type>page</type>
        <title>node title</title>
        <id>2</id>
        <ref>
            <entity>image_ref</entity>
            <ref_value>1</ref_value>
        </ref>
        <ref>
            <entity>category</entity>
            <ref_value>5</ref_value>
        </ref>
    </item>
</channel>
 /*/item[type='image'
        and id=../item[type='page'][1]
                             /ref[entity = 'image_ref']/ref_value
               ]
                /image_url/text()"/>
url_to_image
url2_to_image

嗨,迪米特里,谢谢你的回答,我忘了提到我还有其他的参考标签。我要更新这个问题。我已经用新的结构更新了这个问题+不管怎样,谢谢你的回答。它给了我所有的图片地址。我得到的不仅仅是id为的文档。@SydBarrett,您的XML文档也不是您提供的文档。使用提供的XML文档,XPath表达式生成答案中指定的结果。请更新并提供一个真实的XML文档。另外,请指定与要生成的页面id相对应的URL。@SydBarrett,如果我理解正确,XPath 1.0无法做到这一点,因为它没有定义范围变量的功能。这在XPath 2.0或XSLT中表达是很自然的,在XSLT中可以使用
current()
函数。如果不使用这些表达式,则必须计算两个单独的XPath表达式——一个用于获取所需页面的
ref\u值,另一个用于使用此值提取相应的图像url。嗨,Dimitre,谢谢你的回答,我忘了提到我还有其他ref标记。我要更新这个问题。我已经用新的结构更新了这个问题+不管怎样,谢谢你的回答。它给了我所有的图片地址。我得到的不仅仅是id为的文档。@SydBarrett,您的XML文档也不是您提供的文档。使用提供的XML文档,XPath表达式生成答案中指定的结果。请更新并提供一个真实的XML文档。另外,请指定与要生成的页面id相对应的URL。@SydBarrett,如果我理解正确,XPath 1.0无法做到这一点,因为它没有定义范围变量的功能。这在XPath 2.0或XSLT中表达是很自然的,在XSLT中可以使用
current()
函数。如果不使用这些表达式,则必须计算两个单独的XPath表达式——一个用于获取所需页面的
ref\u值,另一个用于使用此值提取相应的图像url。