XSLT,连接值为逗号分隔的字符串和过滤不必要的元素

问题描述:

如何将XML1转换为XML2?XSLT,连接值为逗号分隔的字符串和过滤不必要的元素

在进一步的步骤中(不是这个问题的一部分),我应该在JSON中转换XML2。 逗号分隔值必须再出现数组:

{111, 222}; 
{456}; 
{777,555}; 
{777,555}; 
{678}; 

预先感谢你的努力了这么多,托马斯

XML1:

<transaction> 
    <records type="1" > 
     <record type="1" > 
     <field number="1" > 
      <subfield> 
       <item>111</item> 
       <item>222</item> 
      </subfield> 
     </field> 
     <field number="2" > 
      <subfield> 
       <item>456</item> 
      </subfield> 
     </field> 
     </record> 
    </records> 

    <records type="14" > 
     <record type="14" > 
     <field number="1" > 
      <subfield> 
       <item>777</item> 
       <item>555</item> 
      </subfield> 
     </field> 
     <field number="2" > 
      <subfield> 
       <item>678</item> 
      </subfield> 
     </field> 
     </record> 
    </records> 
</transaction> 

XML 2:

<transaction> 
    <records type="1" > 
     <record type="1" > 
     <field number="1" >111,222</subfield> 
     </field> 
     <field number="2" >456</field> 
     </record> 
    </records> 

    <records type="14" > 
     <record type="14" > 
     <field number="1" >777,555</field> 
     <field number="2" >678</field> 
     </record> 
    </records> 
</transaction> 
+0

你到目前为止尝试过什么? –

+0

其实,我试图用Java解决这个问题。但是在1.5天后,我意识到这不是一个很好的方法。由于我是XSLT的绝对新手,我希望提供一些提示,让我走向正确的方向。在此先感谢,托马斯 – ThomasMuller

首先,找一本关于XSLT的好书,它的广告。有关建议请参阅Where can I find a good tutorial on XSLT files?

其次,了解身份模板....

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

有了到位,你有没有中途!您只需要担心变换subfield元素。这意味着您只需添加一个匹配subfield的模板,该模板将选择item节点。

<xsl:template match="subfield"> 
    <xsl:for-each select="item"> 
     <xsl:if test="position() > 1">,</xsl:if> 
     <xsl:value-of select="." /> 
    </xsl:for-each> 
</xsl:template> 

或者更好的是,如果你可以使用XSLT 2.0,做到这一点...

<xsl:template match="subfield"> 
    <xsl:value-of select="item" separator="," /> 
</xsl:template> 

试试这个XSLT

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

    <xsl:strip-space elements="*" /> 

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

    <xsl:template match="subfield"> 
     <xsl:value-of select="item" separator="," /> 
    </xsl:template> 
</xsl:stylesheet> 

这并假设每一个field虽然subfield

+0

嗨蒂姆, 你和其他好人在这里把我从痛苦中解救出来。 非常感谢我的朋友! 我真的开始明白XSLT的本质,主要是所有模板之母的意思: ' .. xsl:template> 并感谢其他提示和链接。 致以问候 Thomas --- 其实我不应该开发XSLT,而只是开发RESTful Web服务。 现在在两周内我必须学习高级别的XSLT 1.0,2.0和3.0,并且实现复杂的模板! 直到周末的两天。 我必须在这个星期生存下来:-) – ThomasMuller

+0

使用''样式表上的'version'应该是'2.0',否?托马斯似乎在其他地方使用XSLT 3.0,所以身份模板可以表达得更紧凑,因为该版本中的'。 –

+0

感谢您指出版本号的问题。我修改了我的答案。 –