XSL:搜索一个元素的属性等于当前属性的一个属性

J4N

我有一个XML,目前看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<RootConfig>
  <RandomNode RefId="519263a7-e01e-4cc8-911e-7660dca717bf">
    <Id>101010101010</Id>
  </RandomNode>

  <Item Value="519263a7-e01e-4cc8-911e-7660dca717bf;bf139890-2f7c-4784-8041-68aa5fe7beb1" Type="SomeUniqueType" />
  <Item Value="519263a7-e01e-4cc8-911e-7660dca717bf;5fb8bea0-c79a-4a26-a532-4df59543bc5c" Type="SomeUniqueType" />
  <Item Value="519263a7-e01e-4cc8-911e-7660dca717bf;4f01116a-06f8-4af3-9f4a-87c658eb8008" Type="SomeUniqueType" />
</RootConfig>

在每个项目中,值都引用另一个节点,并为此给定节点提供引用。

我必须将其更改为以这样的文件结尾:

<?xml version="1.0" encoding="utf-8"?>
<RootConfig>
  <RandomNode RefId="519263a7-e01e-4cc8-911e-7660dca717bf">
    <Id>101010101010</Id>
  </RandomNode>
  <Item Reference="bf139890-2f7c-4784-8041-68aa5fe7beb1" Provider-Id="101010101010" />
  <Item Reference="5fb8bea0-c79a-4a26-a532-4df59543bc5c" Provider-Id="101010101010" />
  <Item Reference="4f01116a-06f8-4af3-9f4a-87c658eb8008" Provider-Id="101010101010" />
</RootConfig>

当前,我具有以下XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>


  <xsl:template match="*[@Type='SomeUniqueType']">
    <Item>
      <xsl:call-template name="provided-reference">
        <xsl:with-param name="reference" select="@Value"/>
      </xsl:call-template>
    </Item>
  </xsl:template>

  <xsl:template name="provided-reference">
    <xsl:param name="reference"/>
    <xsl:attribute name="Reference">
      <xsl:value-of select="substring-after($reference, ';')"/>
    </xsl:attribute>
    <xsl:attribute name="Provider-Id">
      <xsl:value-of select="substring-before($reference, ';')"/>
    </xsl:attribute>
  </xsl:template>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

但是我找不到如何查找从中substring-before获取的值,然后获取该Id属性的值的方法

关于如何执行此操作的任何想法?

Mathias Mueller

为此,使用密钥可能会更好,特别是如果RandomNode要使用许多不同的元素进行查找时,尤其如此另外,无需命名模板或参数。

XSLT样式表

Item当然,match="*[@Type='SomeUniqueType']"如果确实需要可以将其模板匹配更改为

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="ref-id-to-id" match="RandomNode" use="@RefId"/>

  <xsl:template match="Item">
      <xsl:copy>
          <xsl:attribute name="Value">
              <xsl:value-of select="substring-after(@Value, ';')"/>
          </xsl:attribute>
          <xsl:attribute name="Provider-Id">
              <xsl:value-of select="key('ref-id-to-id',substring-before(@Value,';'))/Id"/>
          </xsl:attribute>
      </xsl:copy>
  </xsl:template>


    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

XML输出

<?xml version="1.0" encoding="utf-8"?>
<RootConfig>
   <RandomNode RefId="519263a7-e01e-4cc8-911e-7660dca717bf">
      <Id>101010101010</Id>
   </RandomNode>
   <Item Value="bf139890-2f7c-4784-8041-68aa5fe7beb1" Provider-Id="101010101010"/>
   <Item Value="5fb8bea0-c79a-4a26-a532-4df59543bc5c" Provider-Id="101010101010"/>
   <Item Value="4f01116a-06f8-4af3-9f4a-87c658eb8008" Provider-Id="101010101010"/>
</RootConfig>

顺便说一句,对于您的下一个问题:一个更明智的测试用例将包含Item引用了具有不同ID的不同提供程序的元素

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

XPath:如何选择属性值等于另一个元素值的元素

来自分类Dev

如果属性等于值,则获取列表中的第一个元素-VUE.js

来自分类Dev

如果一个属性等于另一属性,如何查找所有记录

来自分类Dev

根据另一个元素属性选择元素

来自分类Dev

深入搜索属性值后返回一个对象

来自分类Dev

如何获得另一个属性等于 x 的属性值?

来自分类Dev

选择一个元素作为具有属性的最后一个子元素

来自分类Dev

搜索中的Ruby on Rails Pluck属性,并使用该属性搜索另一个表

来自分类Dev

如何用属性定义一个空元素?

来自分类Dev

在Powershell中获取第一个元素的属性

来自分类Dev

更改另一个页面的元素属性

来自分类Dev

需要一个没有属性的元素XSD

来自分类Dev

点亮的元素-一个装饰器中的多个属性

来自分类Dev

根据多个属性选择一个html元素

来自分类Dev

jQuery设置另一个元素的onclick属性

来自分类Dev

根据其属性从 Set 中选择一个元素

来自分类Dev

必需XSL:根据当前单元格的属性合并下一个单元格的内容

来自分类Dev

简洁地从另一个属性与搜索匹配的对象数组中仅获取一个对象属性

来自分类Dev

XmlSerialisation:将一个属性序列化为另一个属性的属性

来自分类Dev

递归属性,使用另一个属性中的一个属性

来自分类Dev

WPF通过元素名称将属性绑定到另一个元素属性

来自分类Dev

Android元素属性指向另一个元素属性

来自分类Dev

将值从多个元素上的一个属性携带到另一个属性

来自分类Dev

如何制作一个搜索属性值的搜索框,然后根据用户输入隐藏或显示元素?

来自分类Dev

如何在XML中搜索特定属性以检索另一个属性?

来自分类Dev

一个错误?UIView扩展的属性

来自分类Dev

模拟一个只读的Indexer属性

来自分类Dev

无法从xml读取一个属性

来自分类Dev

创建一个以digit开头的属性

Related 相关文章

  1. 1

    XPath:如何选择属性值等于另一个元素值的元素

  2. 2

    如果属性等于值,则获取列表中的第一个元素-VUE.js

  3. 3

    如果一个属性等于另一属性,如何查找所有记录

  4. 4

    根据另一个元素属性选择元素

  5. 5

    深入搜索属性值后返回一个对象

  6. 6

    如何获得另一个属性等于 x 的属性值?

  7. 7

    选择一个元素作为具有属性的最后一个子元素

  8. 8

    搜索中的Ruby on Rails Pluck属性,并使用该属性搜索另一个表

  9. 9

    如何用属性定义一个空元素?

  10. 10

    在Powershell中获取第一个元素的属性

  11. 11

    更改另一个页面的元素属性

  12. 12

    需要一个没有属性的元素XSD

  13. 13

    点亮的元素-一个装饰器中的多个属性

  14. 14

    根据多个属性选择一个html元素

  15. 15

    jQuery设置另一个元素的onclick属性

  16. 16

    根据其属性从 Set 中选择一个元素

  17. 17

    必需XSL:根据当前单元格的属性合并下一个单元格的内容

  18. 18

    简洁地从另一个属性与搜索匹配的对象数组中仅获取一个对象属性

  19. 19

    XmlSerialisation:将一个属性序列化为另一个属性的属性

  20. 20

    递归属性,使用另一个属性中的一个属性

  21. 21

    WPF通过元素名称将属性绑定到另一个元素属性

  22. 22

    Android元素属性指向另一个元素属性

  23. 23

    将值从多个元素上的一个属性携带到另一个属性

  24. 24

    如何制作一个搜索属性值的搜索框,然后根据用户输入隐藏或显示元素?

  25. 25

    如何在XML中搜索特定属性以检索另一个属性?

  26. 26

    一个错误?UIView扩展的属性

  27. 27

    模拟一个只读的Indexer属性

  28. 28

    无法从xml读取一个属性

  29. 29

    创建一个以digit开头的属性

热门标签

归档