首页 > 解决方案 > XSLT Multiple Input Values 有相同的标签,需要每行放置一个条件

问题描述

[问题] 我的输入值具有相同的标签名称,我需要在每行分隔或放置特定于条件的位置。例如,当<data>以 5 开头时,需要输出父节点上的值,然后当后续值<data>以 6 开头时,需要作为第一个数据的子节点输出。在下一条记录以 5 开头的第二个数据之后,它需要创建一个新<test>标签。*注意:不应打印不以“5”或“6”开头的值。

我已经尝试了很多条件并没有解决这个问题。请告知最佳解决方案。谢谢!

当前语法执行数据如下:

<test/>
<test>
 <data>51234</data>
 <test1>
  <data>61234</data>
 </test1>
 <test1>
  <data>67890</data>
 </test1>
</test>

<test>
 <data>56789</data>
 <test1>
  <data>61234</data>
 </test1>
 <test1>
  <data>67890</data>
 </test1>
</test>

[当前语法]

<xsl:for-each select="test/data">
<test>
    <xsl:if test="starts-with(., '5')">
       <xsl:value-of select="."/>
    </xsl:if>
    <xsl:for-each select="../../test/data">
        <xsl:if test="starts-with(., '6')">
           <test1>
               <xsl:value-of select="."/>
           <test1>
        </xsl:if>
<test>
    </xsl:for-each>
</xsl:for-each>

[ 输入 ]

<test>
    <data>11234</data>                                              
</test>
<test>
    <data>51234</data>                                              
</test>
<test>
    <data>61234</data>
</test>
<test>
    <data>56789</data>                                             
</test>
<test>
    <data>67890</data>
</test>

[预期输出]

<test>
  <data>51234</data> 
  <test1>
        <data>61234</data>
  </test1>
</test>
<test>
  <data>56789</data> 
  <test1>
        <data>67890</data>
  </test1>
</test>

标签: xslt

解决方案


尝试这样的事情:

<xsl:for-each-group select="test[matches(data, '^[56])]" 
    group-starting-with="data[matches(., '^5')]">
  <test>
    <data>
      <xsl:copy-of select="current-group()[1]/data"/>
      <xsl:for-each select="current-group()[position() gt 1]">
       <test1>
         <xsl:copy-of select="."/>
       </test1>
      </xsl:for-each>
    </data>
  </test>
</xsl:for-each-group>

这是 XSLT 2.0。1.0 解决方案要困难得多。


推荐阅读