如何使用预定义规则排列和分组元素?

时间:2012-06-01 12:46:58

标签: xml xslt

美好的一天!

我正在尝试构建一个xsl转换文件来执行下一步:

有一个元素有一堆Character特征的子元素。他们每个人都有自己独特的名字。 我还有一个列表,描述了一些名称和某些命名的特征集(称为数据集)之间的逻辑连接:

CharacteristicsName:DatasetName
----------------------------
Att1_DS1:DS1
Att2_DS1:DS1
Att1_DS2:DS2
Att2_DS2:DS2

我必须转换xml,因此主元素应该获得类型为<Dataset>的新元素。如果列出的特征名称出现在源文档中,则应显示带有表中ID的数据集。然后将相应的特征复制到这些数据集元素/

如果表格中没有列出某些特征名称,那么它应该放在ID为“其他”的数据集中

源XML:

<Object>
    <ID>Obj1</ID>

    <!--DS1-->     
    <Characteristic>
        <Name>Att1_DS1</Name>
        <Value>25</Value>
    </Characteristic>

    <!--DS2-->
    <Characteristic>
        <Name>Att1_DS2</Name>
        <Value>25</Value>
    </Characteristic>

    <!--DS1-->  
    <Characteristic>
        <Name>Att2_DS1</Name>
        <Value>ABC</Value>
    </Characteristic>       

    <!--DS2-->
    <Characteristic>
        <Name>Att2_DS2</Name>
        <Value>ABC</Value>
    </Characteristic>   

            <!--Other-->
    <Characteristic>
        <Name>Att3_NN</Name>
        <Value>25</Value>
    </Characteristic>   

</Object>

应该转换为:

<Object>
    <ID>Obj1</ID>

    <Dataset id="DS1">
        <Characteristic>
            <Name>Att1_DS1</Name>
            <Value>25</Value>
        </Characteristic>
        <Characteristic>
            <Name>Att2_DS1</Name>
            <Value>ABC</Value>
        </Characteristic>
    </Dataset>

    <Dataset id="DS2">
        <Characteristic>
            <Name>Att1_DS1</Name>
            <Value>25</Value>
        </Characteristic>
        <Characteristic>
            <Name>Att2_DS1</Name>
            <Value>ABC</Value>
        </Characteristic>
    </Dataset>

    <Dataset id="Other">
        <Characteristic>
            <Name>Att3_NN</Name>
            <Value>25</Value>
        </Characteristic>
    </Dataset>

</Object>

你能帮我做这些吗?我应该采取哪些方向或想法?

1 个答案:

答案 0 :(得分:0)

此转化

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:my="my:my" exclude-result-prefixes="my">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>

      <my:datasets>
       <ds>
         <id>DS1</id>
         <n>Att1_DS1</n>
         <n>Att2_DS1</n>
       </ds>
       <ds>
         <id>DS2</id>
         <n>Att1_DS2</n>
         <n>Att2_DS2</n>
       </ds>
       <ds>
         <id>other</id>
         <n>Att3_NN</n>
       </ds>
      </my:datasets>

      <xsl:variable name="vDS" select="document('')/*/my:datasets/*"/>

      <xsl:template match="/*">
       <Object>
         <xsl:copy-of select="ID"/>

         <xsl:apply-templates select=
            "$vDS[n = current()/Characteristic/Name]">
          <xsl:with-param name="pChars" select="Characteristic"/>
         </xsl:apply-templates>
       </Object>
      </xsl:template>

      <xsl:template match="ds">
       <xsl:param name="pChars"/>
        <Dataset id="{id}">
         <xsl:copy-of select="$pChars[Name = current()/n]"/>
        </Dataset>
      </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<Object>
    <ID>Obj1</ID>

    <Characteristic>
        <Name>Att1_DS1</Name>
        <Value>25</Value>
    </Characteristic>

    <Characteristic>
        <Name>Att1_DS2</Name>
        <Value>25</Value>
    </Characteristic>

    <Characteristic>
        <Name>Att2_DS1</Name>
        <Value>ABC</Value>
    </Characteristic>

    <Characteristic>
        <Name>Att2_DS2</Name>
        <Value>ABC</Value>
    </Characteristic>

    <Characteristic>
        <Name>Att3_NN</Name>
        <Value>25</Value>
    </Characteristic>
</Object>

生成想要的正确结果

<Object>
   <ID>Obj1</ID>
   <Dataset id="DS1">
      <Characteristic>
         <Name>Att1_DS1</Name>
         <Value>25</Value>
      </Characteristic>
      <Characteristic>
         <Name>Att2_DS1</Name>
         <Value>ABC</Value>
      </Characteristic>
   </Dataset>
   <Dataset id="DS2">
      <Characteristic>
         <Name>Att1_DS2</Name>
         <Value>25</Value>
      </Characteristic>
      <Characteristic>
         <Name>Att2_DS2</Name>
         <Value>ABC</Value>
      </Characteristic>
   </Dataset>
   <Dataset id="other">
      <Characteristic>
         <Name>Att3_NN</Name>
         <Value>25</Value>
      </Characteristic>
   </Dataset>
</Object>