通过标记值加入来自不同节点的数据

时间:2018-02-10 19:50:39

标签: xml xslt xslt-1.0 transform

我有一个包含对象数据的输入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>

1 个答案:

答案 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>

输出符合要求。