通过标签值连接来自不同节点的数据

Posted

技术标签:

【中文标题】通过标签值连接来自不同节点的数据【英文标题】:Join data from different nodes by tag value 【发布时间】:2018-07-21 08:25:05 【问题描述】:

我有一个包含对象数据的输入 XML 文件。 每个对象都有名称和值的点。 每个点在不同的节点中都有附加数据。 两个节点的值相同。 我需要将其转换为能够导入数据库的 XML。 对于每一点,我希望有 1 条具有价值和附加价值的记录。 用 XSL 怎么办?

感谢您的帮助

输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Objects>
    <Object>
        <Name>Object1</Name>        
        <Side_Left>
            <Point>
                <Name>A</Name>
                <Value>1</Value>
            </Point>
            <Point>
                <Name>B</Name>
                <Value>2</Value>
            </Point>
        </Side_Left>
        <Side_Right>
            <Point>
                <Name>C</Name>
                <Value>3</Value>
            </Point>
            <Point>
                <Name>D</Name>
                <Value>4</Value>
            </Point>
        </Side_Right>
        <Side_Left_Additional_Data>
            <Point>
                <Name>A</Name>
                <Value>10</Value>
            </Point>
            <Point>
                <Name>B</Name>
                <Value>20</Value>
            </Point>            
        </Side_Left_Additional_Data>        
        <Side_Right_Additional_Data>
            <Point>
                <Name>C</Name>
                <Value>30</Value>
            </Point>
            <Point>
                <Name>D</Name>
                <Value>40</Value>
            </Point>
        </Side_Right_Additional_Data>

    </Object>
</Objects>

必需的输出 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Objects>
    <Object>
        <Name>Object1</Name>
        <Point>
            <Name>A</Name>
            <Value>1</Value>
            <Addtional_Value>10</Addtional_Value>
        </Point>
        <Point>
            <Name>B</Name>
            <Value>2</Value>
            <Addtional_Value>20</Addtional_Value>
        </Point>        
        <Point>
            <Name>C</Name>
            <Value>3</Value>
            <Addtional_Value>30</Addtional_Value>
        </Point>
        <Point>
            <Name>D</Name>
            <Value>4</Value>
            <Addtional_Value>40</Addtional_Value>
        </Point>
    </Object>
</Objects>

【问题讨论】:

我从您的 XML 中删除了 xsl:stylesheet 节点,因为它们没有意义。 【参考方案1】:

将输入 XML 转换为输出 XML 的 XSLT-1.0 样式表如下所示。它由三个xsl:templates 组成,处理输入 XML 的每个级别。

XPath 表达式

<xsl:apply-templates select="Side_Left/Point | Side_Right/Point" />

确实处理所有主要的Point 节点集并复制它们。

但中心 XPath 表达式是

../../*[contains(local-name(),'Additional')]/Point[Name = $curName]/Value

将相关的Side_*_Additional_Data/Point/Value 值复制到相关的Side_*/Point 元素。

这里是完整的 XSLT(1.0 版):

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

    <xsl:template match="/Objects">
      <xsl:copy>
        <xsl:apply-templates select="Object" />
      </xsl:copy>
    </xsl:template>

    <xsl:template match="Object">
      <xsl:copy-of select="Name" />
      <xsl:apply-templates select="Side_Left/Point | Side_Right/Point" />
    </xsl:template>

    <xsl:template match="Point">
      <xsl:variable name="curName" select="Name" />
      <xsl:copy>
        <xsl:copy-of select="*" />  
        <Addtional_Value>
          <xsl:value-of select="../../*[contains(local-name(),'Additional')]/Point[Name = $curName]/Value" />      
        </Addtional_Value>
      </xsl:copy>
    </xsl:template>    

</xsl:stylesheet>

输出符合要求。

【讨论】:

以上是关于通过标签值连接来自不同节点的数据的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB 根据列值连接来自不同数据库的表

使用来自不同列的值通过数据源填充组合框

具有相同时间戳但测量值不同的 InfluxDB 写入点

oneid方法-图计算

python使用pandas通过聚合获取时序数据的最后一个指标数据(例如长度指标时间指标)生成标签并与原表连接(join)进行不同标签特征的可视化分析

Mysqli 连接来自 2 个不同数据库的表