选择何时&每个人

时间:2014-07-21 14:40:01

标签: xml xslt

网站新手和xsl所以请耐心等待。不确定这篇文章将如何发布,我可能需要上传实际的XML / XSL。

我有一个包含两个基本组的XML。 1表示气体,1表示电气。它的设置如下:

   <TS_810>
      <Group_6>
        <IT1>
          <IT107>ELECTRIC</IT107>
        </IT1>
        <GROUP_9>
           +<SLN>
            <SAC>
              <SAC01>DETAILS</SAC01>
              <SAC02>DETAILS2</SAC02>
            </SAC>
         </GROUP_9>
         <GROUP_9>
           +<SLN>
            <SAC>
              <SAC01>DETAILS</SAC01>
              <SAC02>DETAILS2</SAC02>
            </SAC>
         </GROUP_9>
       </GROUP_6>
       <Group_6>
        <IT1>
          <IT107>GAS</IT107>
        </IT1>
        <GROUP_9>
           +<SLN>
            <SAC>
              <SAC01>DETAILS</SAC01>
              <SAC02>DETAILS2</SAC02>
            </SAC>
         </GROUP_9>
         <GROUP_9>
           +<SLN>
            <SAC>
              <SAC01>DETAILS</SAC01>
              <SAC02>DETAILS2</SAC02>
            </SAC>
         </GROUP_9>
       </GROUP_6>

我正在尝试在GROUP_6中识别Electric的IT107部分,然后为其选择每个GROUP_9细节线。完成后,我想在下一个GROUP_6中为Gas选择IT107部分,然后选择其相关GROUP_9部分中的所有细节线。

我所拥有的xsl代码正在执行以下操作。请注意,它不是所有代码,只是选择/何时/为每个部分。

    <xsl: choose>
       <xsl:when tes="GROUP_6/IT1/IT107 = 'ELECTRIC'">
          <xsl:for-each select="GROUP_6/GROUP_9/SAC">

         <fo:table-row>
           <xsl:value-of select="SAC01"/>
         </fo:table-row>

发生的事情是我获得了Electric的详细信息,但我也得到了气体部分Group_6 / Group_9的详细信息。选择组循环似乎不仅仅选择GROUP_6电气部分。

有没有办法只为ELECTRIC选择Group_6 / Group_9线?然后我将创建另一个选择为GAS选择Group_6 / Group_9行。

或者有没有办法在选择SAC01细节之前回顾IT107部分的价值?

有什么想法?有道理吗?

1 个答案:

答案 0 :(得分:0)

当你测试Group_6是否包含'Electric'时,它总会返回true,因为至少有一个Group_6中有'Electric'。

然后你的循环来得太晚了。一个好的解决方案是放弃时间并使用以下每个:

<xsl:for-each select="GROUP_6[IT1/IT107 = 'ELECTRIC']/GROUP_9/SAC">

此循环将输入所有具有'ELECTRIC'的GROUP_6。使用方括号,您可以在其中发布条件(正确的术语是predicates

这里是我的input.xml和test.xslt:

<TS_810>
    <Group_6>
        <IT1>
            <IT107>ELECTRIC</IT107>
        </IT1>
        <GROUP_9>
            <SAC>
                <SAC01>DETAILS</SAC01>
                <SAC02>DETAILS2</SAC02>
            </SAC>

        </GROUP_9>
        <GROUP_9>
            <SAC>
                <SAC01>DETAILS</SAC01>
                <SAC02>DETAILS2</SAC02>
            </SAC>

        </GROUP_9>
    </Group_6>
    <Group_6>
        <IT1>
            <IT107>GAS</IT107>
        </IT1>
        <GROUP_9>
            <SAC>
                <SAC01>DETAILS</SAC01>
                <SAC02>DETAILS2</SAC02>
            </SAC>

        </GROUP_9>
        <GROUP_9>
            <SAC>
                <SAC01>DETAILS</SAC01>
                <SAC02>DETAILS2</SAC02>
            </SAC>

        </GROUP_9>
    </Group_6>
</TS_810>

样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output indent="yes"/>

    <xsl:template match="/TS_810">
        <root>
            <xsl:for-each select="Group_6[IT1/IT107 = 'ELECTRIC']/GROUP_9/SAC">
                <SAC><xsl:value-of select="'Electric SAC'"/></SAC>               
        </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>

给你那个输出(只有两个来自Electric):

<root>
    <SAC>Electric SAC</SAC>
    <SAC>Electric SAC</SAC>
</root>