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>
首先,找一本关于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
。
嗨蒂姆, 你和其他好人在这里把我从痛苦中解救出来。 非常感谢我的朋友! 我真的开始明白XSLT的本质,主要是所有模板之母的意思: '
使用'
感谢您指出版本号的问题。我修改了我的答案。 –
你到目前为止尝试过什么? –
其实,我试图用Java解决这个问题。但是在1.5天后,我意识到这不是一个很好的方法。由于我是XSLT的绝对新手,我希望提供一些提示,让我走向正确的方向。在此先感谢,托马斯 – ThomasMuller