如何在XSLT中处理相同的元素并将其组合

时间:2018-07-11 13:21:50

标签: xml xslt

早上好!我想知道是否有人可以检查此模板并建议如何将具有值的两个元素组合为单个元素。我在XSLT方面并不擅长,并且试图获得越来越多的知识。我可以结合相同的元素吗?在XSLT中有可能吗?请指教。

这里的输入XML如下:

<?xml version='1.0' ?>
<Case>
   <NumberCase>
    <Id>855065623159993</Id>
   </NumberCase>
   <Document>
       <ReferenceList>|9486HSDGH|201JKDF|</ReferenceList>
               <ClaimList>|123456823|123456824|</ClaimList>
       </Document>
       <Document>
       <Lastname>GREEN</Lastname>
       <ReferenceList>|01364</ReferenceList>
       <ClaimList>|123456823</ClaimList>
   </Document>
    </Case>

XSLT转换后到目前为止的输出

   <?xml version="1.0" encoding="utf-8"?>
   <Case>
     <NumberCase>
           <ImageId>065623159993</ImageId>
           <Lastname>GREEN</Lastname>
           <SIUReferenceList>
               <ReferenceList>|9486HSDGH|201JKDF|</ReferenceList>
               <ReferenceList>|01364</ReferenceList>
           </SIUReferenceList>
           <ClaimNoList>
               <ClaimNoList>|123456823|123456824|</ClaimNoList>
               <ClaimNoList>|123456823</ClaimNoList>
           </ClaimNoList>
         </NumberCase>
      </Case>

到目前为止,这是我的XSLT模板

       <xsl:output method="xml" indent="yes"/>
       <msxsl:text disable-output-escaping="yes"></msxsl:text>

       <xsl:template match="Case">       
       <xsl:element name="NumberCase">
             <xsl:element name="NumberCase"> 
                  <xsl:element name ="Id">
                  <xsl:value-of select="NumberCase/Id"/>
              </xsl:element>  

              <xsl:element name ="Lastname">
                  <xsl:value-of select="Document/Lastname"/>
                  </xsl:element> 

                  <xsl:element name ="ReferenceList">
                      <xsl:copy-of select="Document/ReferenceList"/>
                  </xsl:element>       

                   <xsl:element name="ClaimList">                        
                 <xsl:copy-of select="Document/ClaimList"/>              
                   </xsl:element>             
              </xsl:element> 
            </xsl:element>   
           </xsl:template>
         </xsl:stylesheet>

我想要的输出是将两个相同的元素组合成这样的东西:

<ReferenceList>|9486HSDGH|201JKDF|01364</ReferenceList>
<ClaimNoList>|123456823|123456824|123456823</ClaimNoList>

2 个答案:

答案 0 :(得分:0)

您添加了一些额外的复杂性,因为|9486HSDGH|201JKDF||01364的组合是|9486HSDGH|201JKDF||01364(即,您得到了双管道)。

假设第一个元素始终以管道结尾,第二个元素始终以管道开头,一种解决方案是使用xsl:for-each而不是xsl:copy

例如,对于ReferenceList,您可以这样做:

<ReferenceList>
  <xsl:for-each select="Document/ReferenceList">
    <xsl:choose>
      <xsl:when test="position() = 1">
        <xsl:value-of select="." />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="substring(., 2)" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each>
</ReferenceList>

或者这个...

<ReferenceList>
  <xsl:for-each select="Document/ReferenceList">
    <xsl:value-of select="substring(., 1 + number(position() > 1))" />
  </xsl:for-each>
</ReferenceList>

或者也许是这个...

<ReferenceList>
  <xsl:text>|</xsl:text>
  <xsl:for-each select="Document/ReferenceList">
     <xsl:value-of select="substring(., 2)" />
  </xsl:for-each>
</ReferenceList>

答案 1 :(得分:0)

这是解决我的问题的最终模板,将两个相同的元素合并为一个。

       

Expected data
[![enter image description here][2]][2]


  [1]: https://i.stack.imgur.com/gU2aO.png
  [2]: https://i.stack.imgur.com/yaY5l.png




Please help to find out year and quarter wise data in SQL as pivot