如果假设相同的标签将被重复,但标签值将不同,因为我需要使用xslt分别获取,如果我这样做,两个标签值将在单行
中获取这是我的xml:
<local>
<message>
<block4>
<tag>
<name>72</name>
<value>ALW103111102000001</value>
</tag>
<tag>
<name>70</name>
<value>TESTING CITI BANK EFT9</value>
</tag>
<tag>
<name>71A</name>
<value>OUR</value>
</tag>
<tag>
<name>72</name>
<value>ipubby</value>
</tag>
</block4>
</message>
</local>
这是我的xslt:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="local/message">
<xsl:for-each select ="block4/tag[name = '72']">
<xsl:value-of select="value"/>
</xsl:for-each>,<xsl:text/>
<xsl:for-each select ="block4/tag[name = '72']">
<xsl:value-of select="value"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出要求如下:
ALW103111102000001, ipubby
看起来您要求的是要将所有标签元素与名称为72的元素匹配,并将这些值连接到一行。
目前,您正在嵌套xsl:for-each语句,这导致元素被选择两次,并且您的输出行被重复。
你需要做的就是选择第一个标签,像这样
<xsl:value-of select="block4/tag[name = '72'][1]/value"/>
然后你可以得到剩下的标签比如....
<xsl:for-each select="block4/tag[name = '72'][position() > 1]">
注意,最好使用xsl:apply-templates来匹配节点,而不是使用xsl:for-each。
下面是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="local/message"/>
</xsl:template>
<xsl:template match="message">
<xsl:value-of select="block4/tag[name = '72'][1]/value"/>
<xsl:apply-templates select="block4/tag[name = '72'][position() > 1]"/>
</xsl:template>
<xsl:template match="tag">
<xsl:text>,</xsl:text>
<xsl:value-of select="value"/>
</xsl:template>
</xsl:stylesheet>
当应用于给定的输入XML时,输出如下所示:
ALW103111102000001,ipubby