在XSLT中将元素循环到单个元素

时间:2016-12-02 15:37:46

标签: xslt xslt-1.0 xslt-2.0

我需要转换以下内容

    <QTLS_ITEM>
      <ID>123</ID>
      <ID1>1345</ID1>
      <SERAIL_NUMBER>1026977­04257</SERAIL_NUMBER>
     <PROD_NAME>upgrade</PROD_NAME>
    </QTLS_ITEM>
    <QTLS_ITEM>
      <ID>123</ID>
      <ID1>1345</ID1>
      <SERAIL_NUMBER>1026977­04257</SERAIL_NUMBER>
      <PROD_NAME>Plug­in</PROD_NAME>
    </QTLS_ITEM>
    <QTLS_ITEM>
      <ID>123</ID>
      <ID1>1345</ID1>
      <SERAIL_NUMBER>1026977­04257</SERAIL_NUMBER>
      <PROD_NAME>License</PROD_NAME>
    </QTLS_ITEM>

这是一个循环元素类型。<QTLS_ITEM>是一个重复元素。对于每个元素,我必须连接这两个字段并获得如下的值 我想将它转换为单个元素,如

<Item_description>
1026977­04257 upgrade
1026977­04257 Plug­in
1026977­04257 License
<Item_Description>

这意味着我需要连接SERAIL_NUMBERPROD_NAME 任何人都可以帮忙吗?

<xsl:template name="string-join">
  <xsl:param name="nodes"/>
  <xsl:param name="delimiter"/>
  <xsl:for-each select="$nodes">
    <xsl:value-of select="."/>
    <xsl:if test="$nodes[position()!=last()-1]">
      <xsl:value-of select="$delimiter"/>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

我用这个来用逗号分隔序列号。但我想连接并以上述格式得到结果。

我的案例的答案是

<xsl:template name="join">
    <xsl:param name="list"/>
    <xsl:param name="separator"/>
    <xsl:for-each select="db:SERAIL_NUMBER | db:PROD_NAME">($list value)
      <xsl:value-of select="."/>
      <xsl:if test="position() != last()">
        <xsl:value-of select="$separator"/>
      </xsl:if>
    </xsl:for-each>
  </xsl:template> 

2 个答案:

答案 0 :(得分:1)

您向我们展示的输入不是格式良好的XML,因为它没有单个根元素。给定格式良好的XML输入,例如:

<强> XML

<root>
   <QTLS_ITEM>
      <SERAIL_NUMBER>102697704257</SERAIL_NUMBER>
      <PROD_NAME>upgrade</PROD_NAME>
   </QTLS_ITEM>
   <QTLS_ITEM>
      <SERAIL_NUMBER>102697704257</SERAIL_NUMBER>
      <PROD_NAME>Plugin</PROD_NAME>
   </QTLS_ITEM>
   <QTLS_ITEM>
      <SERAIL_NUMBER>102697704257</SERAIL_NUMBER>
      <PROD_NAME>License</PROD_NAME>
   </QTLS_ITEM>
</root>

你可以做到:

XSLT 2.0

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

<xsl:template match="/root">
    <Item_description>
        <xsl:for-each select="QTLS_ITEM">
            <xsl:value-of select="SERAIL_NUMBER, PROD_NAME" />
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </Item_description>
</xsl:template>

</xsl:stylesheet>

得到:

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<Item_description>102697704257 upgrade
102697704257 Plugin
102697704257 License
</Item_description>

答案 1 :(得分:-1)

这在我的案例中已经解决了

<xsl:template name="join">
    <xsl:param name="list"/>
    <xsl:param name="separator"/>
    <xsl:for-each select="db:SERAIL_NUMBER|db:PROD_NAME">($list value)
      <xsl:value-of select="."/>
      <xsl:if test="position() != last()">
        <xsl:value-of select="$separator"/>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>