0

我有以下 XML

<Root>
<PW>
  <Wec>
    <ID>11425</ID>
    <Data>
      <item>A3400301040TT01</item>
      <item>A3400301040TT02</item>
      <item>A3400301040TT03</item>
    </Data>
  </Wec>
  <Wec>
    <Data>
    <ID>11426</ID>
      <item>A3400302040TT01</item>
      <item>A3400302040TT03</item>
      <item>A3400302040TT02</item>
    </Data>
  </Wec>
</PW>
<PWSlots>
  <Rec>11</Rec>
  <Rec>12</Rec>
  <Rec>13</Rec>
  <Rec>14</Rec>
  <Rec>16</Rec>
  <Rec>15</Rec>
</PWSlots>
</Root>

我想生成一个这样的xml

<Root>
<PW>
  <Wec>
    <ID>11425</ID>
    <Data>
      <Item id="A3400301040TT01" slotNumber="11"/>
      <item id="A3400301040TT02" slotNumber="12"/>
      <item id="A3400301040TT03" slotNumber="13"/>
    </Data>
  </Wec>
  <Wec>
    <ID>11426</ID>
    <Data>        
      <item id="A3400302040TT01" slotNumber="14"/>
      <item id="A3400302040TT03" slotNumber="16"/>
      <item id="A3400302040TT02" slotNumber="15"/>
    </Data>
  </Wec>
</PW>
</Root>   

好的,所以我正在为每个 Wec 标签做一个 xsl:foreach,在那个 foreach 里面我有另一个循环遍历每个项目标签。当我尝试将插槽作为项目的一部分包含在内时出现问题,因为我在特定的 Wec 节点内循环。

我需要一种基于特定项目标签的机制,我可以获取该项目节点的当前出现(在整个 xml 字符串中),以了解我必须从 PWSlots 分配的特定 Rec 标签。

举个例子,我在第一个 Wec 标签(ID 11425)中循环。由于这是节点项的第一次出现,我必须在 PWSlots 下分配第一个 Rec 标记的值。

关于如何使用 XSL 做到这一点的任何想法?感谢你的帮助

4

2 回答 2

2

我要做的是使用推送方法而不是拉取和使用xsl:numberposition()获得正确的Rec值。

我没有改变ID第二个的位置,Wec因为它看起来像是一个错字。如果这需要移动而您无法弄清楚,请告诉我。

例子...

XML 输入

<Root>
    <PW>
        <Wec>
            <ID>11425</ID>
            <Data>
                <item>A3400301040TT01</item>
                <item>A3400301040TT02</item>
                <item>A3400301040TT03</item>
            </Data>
        </Wec>
        <Wec>
            <Data>
                <ID>11426</ID>
                <item>A3400302040TT01</item>
                <item>A3400302040TT03</item>
                <item>A3400302040TT02</item>
            </Data>
        </Wec>
    </PW>
    <PWSlots>
        <Rec>11</Rec>
        <Rec>12</Rec>
        <Rec>13</Rec>
        <Rec>14</Rec>
        <Rec>16</Rec>
        <Rec>15</Rec>
    </PWSlots>
</Root>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="item">
        <xsl:variable name="pos">
            <xsl:number level="any"/>
        </xsl:variable>
        <item id="{.}" slotNumber="{/*/PWSlots/Rec[number($pos)]}"/>
    </xsl:template>

    <xsl:template match="PWSlots"/>

</xsl:stylesheet>

XML 输出

<Root>
   <PW>
      <Wec>
         <ID>11425</ID>
         <Data>
            <item id="A3400301040TT01" slotNumber="11"/>
            <item id="A3400301040TT02" slotNumber="12"/>
            <item id="A3400301040TT03" slotNumber="13"/>
         </Data>
      </Wec>
      <Wec>
         <Data>
            <ID>11426</ID>
            <item id="A3400302040TT01" slotNumber="14"/>
            <item id="A3400302040TT03" slotNumber="16"/>
            <item id="A3400302040TT02" slotNumber="15"/>
         </Data>
      </Wec>
   </PW>
</Root>
于 2013-10-05T04:02:12.513 回答
2

我更喜欢@Daniel 的方法。但这里有一个替代解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" encoding="utf-8" indent="yes" />

   <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*" />
      </xsl:copy>
   </xsl:template>

   <!-- remove PWSlots -->
   <xsl:template match="PWSlots" />

   <xsl:template match="item">
      <xsl:variable name="id" select="normalize-space()" />
      <xsl:variable name="pos">
         <xsl:for-each select="//item">
            <xsl:if test="normalize-space(.)=$id">
               <xsl:value-of select="position()" />
            </xsl:if>
         </xsl:for-each>
      </xsl:variable>
      <Item id="{.}">
         <xsl:attribute name="slotNumber">
            <xsl:value-of select="//PWSlots/Rec[number($pos)]" />
         </xsl:attribute>
      </Item>
   </xsl:template>
</xsl:stylesheet>
于 2013-10-05T04:29:59.663 回答