我有一个包含对象数据的输入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>
答案 0 :(得分:0)
将输入XML转换为输出XML的XSLT-1.0样式表如下所示。它由三个xsl:template
处理输入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>
输出符合要求。