xml文件如下所示我想要concat值name,add1,city,add2以逗号分隔
<Details>
<name>abc</name>
<profile>
<address>
<add1>ccc</add1>
<add2>bbb</add2>
<city>CA</city>
</address>
</profile>
</Details>
我想要输出如下: -
abc, ccc, CA, bbb
(我的意思是城市将在add2之前出现,如果任何值为空,那么它将相应调整)
答案 0 :(得分:1)
如果您要输出详细信息元素中的所有文本节点,只需使用 xsl:for-each 对其进行迭代,然后使用 position()函数,如果节点不是第一个,则输出逗号
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Details">
<xsl:for-each select="//text()">
<xsl:if test="position() > 1">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:value-of select="." />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
因此,如果您的某个元素中没有文本,则不会输出或有额外的逗号。
答案 1 :(得分:0)
<xsl:variable name="name">
<xsl:value-of select="Details/name"/>
</xsl:variable>
<xsl:variable name="add1">
<xsl:value-of select="Details/profile/address/add1"/>
</xsl:variable>
<xsl:variable name="add2">
<xsl:value-of select="Details/profile/address/add2"/>
</xsl:variable>
<xsl:variable name="city">
<xsl:value-of select="Details/profile/address/city"/>
</xsl:variable>
<xsl:value-of select="concat($name,',',$add1,',',$city,',',$add2)"/><br>
如果add1返回abc, ccc, CA, bbb
,它会显示O {\ P null
这样的O / P然后它会显示为abc, , CA, bbb
答案 2 :(得分:0)
如果您使用的是XSLT 2.0,可以使用()
运算符按照您想要的顺序构建序列,然后使用separator
上的xsl:value-of
属性输出整个序列逗号:
<xsl:template match="Details">
<xsl:value-of select="(name, profile/address/add1, profile/address/city,
profile/address/add2)" separator=", " />
</xsl:template>
如果要过滤掉具有空值的元素(例如,如果文档包含<city/>
),那么您可以使用选择表达式的谓词来执行此操作:
(name, profile/address/add1, profile/address/city,
profile/address/add2)[normalize-space()]
谓词从序列中删除任何值为空或完全由空格组成的节点。