通过标签值连接来自不同节点的数据
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:template
s 组成,处理输入 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>
输出符合要求。
【讨论】:
以上是关于通过标签值连接来自不同节点的数据的主要内容,如果未能解决你的问题,请参考以下文章
python使用pandas通过聚合获取时序数据的最后一个指标数据(例如长度指标时间指标)生成标签并与原表连接(join)进行不同标签特征的可视化分析