使用xsl连接xml父级和子级属性值

恶魔

我想将一个属性的父值与另一个属性的子值连接起来,还要从xml文件中删除特定的属性。我的输入xml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<import_data>
    <product part_number="12345" category="Parts and Accessories" description="Small-Part">
        <product_attribute name="organizationCode" value="XYZ"/>
        <product_attribute name="Product Market" value="Rotors"/>
        <product_attribute name="inventoryItemId" value="6789">
    </product>
    <product part_number="ABCDE" category="Ball Bearings" description="Small-Part">
        <product_attribute name="organizationCode" value="XYZ"/>
        <product_attribute name="Product Market" value="Rings"/>
        <product_attribute name="inventoryItemId" value="FGHIJ">
    </product>
</import_data>

并且输出应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<import_data>
    <product part_number="12345" category="Rotors.Parts and Accessories" description="Small-Part">
        <product_attribute name="Product Market" value="Rotors"/>
    </product>
    <product part_number="ABCDE" category="Rings.Ball Bearings" description="Small-Part">
        <product_attribute name="Product Market" value="Rings"/>
    </product>
</import_data>

我的xsl看起来像这样:

<?xml version="1.0"  encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
>
<xsl:strip-space elements="*"/>
<xsl:output method="xml"  encoding="UTF-8" omit-xml-declaration="yes"/>

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


<xsl:template match="//so_product_attribute[@name='inventoryItemId']" />
<xsl:template match="//so_product_attribute[@name='organizationCode']" />

<xsl:template match="processing-instruction('xml-stylesheet')"/>
</xsl:stylesheet>

我已经弄清楚了如何删除不需要的元素(inventoryItemId和organizationCode),但是我无法弄清楚如何读取子元素的值(product_attribute name =“ Product Market” value =“ Rotors”)并将其与父属性的(product category =“ Parts and Accessories”)属性的值,以便将其合并为(product category =“ Rotors.Parts and Accessories”)。我已经尝试过使用xsl:for-each并将子级的值读取到变量中,但是我无法连接并输出所需的值。任何帮助将不胜感激。

1号

略微调整了您的XSLT:

<?xml version="1.0"  encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  >
  <xsl:strip-space elements="*"/>
  <xsl:output method="xml"  encoding="UTF-8" omit-xml-declaration="yes"/>

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

  <xsl:template match="product[normalize-space(product_attribute[@name = 'Product Market']/@value)]/@category">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="concat(parent::product/product_attribute[@name = 'Product Market']/@value, '.', .)"/>  
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="product_attribute[@name='inventoryItemId']" />
  <xsl:template match="product_attribute[@name='organizationCode']" />

  <xsl:template match="processing-instruction('xml-stylesheet')"/>
</xsl:stylesheet>
  • 加入匹配模板product/@category,如果@valueproduct_attribute[@name = 'Product Market']是一个非空字符串。[如果没有,这会避免在类别前面加点号]
  • 创建具有相同名称的新属性,并@value使用.和和context-node的内容(当前属性)进行连接。
  • 更改so_product_attribute为正确的输入元素名称
  • 不要从//匹配模式开始

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Python和lxml检索XML父级和子级属性

复制父级和子级属性

使用xmlstarlet遍历xml并输出父级和子级节点值

使用递归获得父级值和子级值及其所有子级的子级值

使用父级属性动态解组子XML

XPath:根据父级属性获取子级值

Python与ElementTree在同一循环中获取XML的父级和子级值

一起列出父级和子级值

分别查询父级和子级时,EF Core使用导航属性

在父级的构造函数中使用子级的属性

如何使用数据绑定Android从Pojo访问父级和子级的值

使用父级和子级从表中获取值

使用EntityFramework向父级和子级升级

使用JPA批注自动从父级删除子级和从子级删除父级

递归连接父级属性

根据子级值删除父级

PHP选择父级和子级

如果在父级和子级上指定了不同的区域属性值,会发生什么?

XSL转换拆分标签-添加到父级和子级

使用jquery或javascript为父级和子级属性创建手风琴下拉菜单

与子级父级和父级子级vue.js对话

给定父级ID和子级,在lodash中嵌套父级子级关系

Linq XML使用属性中的特定值查询父级的后代

使用Java分割较大尺寸的XML文件(保留父级的属性和兄弟姐妹)

SQL Server CTE获取父级的子级,然后使用父级值更新子级

Javascript-在相同的JSON字符串中打包父级和子级的属性

SQL如何获取父级及其所有子级和子级的子级...等

XSLT-转换XML,然后删除空的父级和子级

将一个父级和多个相同的子级转换为 xml