0

再会!

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

有一个元素有一堆 Characteristic 类型的子元素。它们中的每一个都有其唯一的名称。我还有一个列表,描述了一些名称和某个命名特征集(称为数据集)之间的逻辑连接:

CharacteristicName : 数据集名称
−−−−−−−−−−−−−−−−−−−−−−−−−−−
Att1_DS1 : DS1
Att2_DS1 : DS1
Att1_DS2 : DS2
Att2_DS2 : DS2

我必须转换 xml 以便主要元素应该获得 type 的新元素<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>

你能帮我做这些吗?任何提示或想法我应该朝哪个方向移动?

4

1 回答 1

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>
于 2012-06-01T13:13:07.977 回答