XSLT,concat值以逗号分隔字符串并过滤不必要的元素

时间:2017-10-18 08:30:06

标签: xml xslt

如何将XML1转换为XML2?

在进一步的步骤(不是这个问题的一部分)我应该在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>

1 个答案:

答案 0 :(得分:2)

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

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

doSomething

有了这个,你就到了中途!您只需要担心转换<xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> 元素。这意味着您只需添加一个匹配subfield的模板,该模板会选择subfield个节点。

item

或者,更好的是,如果您可以使用XSLT 2.0,请执行此操作...

<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

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

这假设每<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> subfieldfield