对于这个XML -
<phoneContact>
<firstName>XXXXX</firstName>
<middleName>Y</middleName>
<lastName>ZZZZZ</lastName>
<generationalSuffix>Jr.</generationalSuffix>
<phone>1234567890</phone>
</phoneContact>
<phoneContact>
<firstName>AAAA</firstName>
<middleName>B</middleName>
<lastName>CCCCC</lastName>
<phone>9876543210</phone>
<!-- notice no generationalSuffix -->
</phoneContact>
并使用此XSL -
<xsl:for-each select="phoneContact">
<xsl:element name="phoneContact{position()}">
<name>
<xsl:if test="firstName">
<xsl:value-of select="firstName"/>
<xsl:text> </xsl:text> <!-- Add SPACE as a delimeter -->
</xsl:if>
<xsl:if test="middleName">
<xsl:value-of select="middleName"/>
<xsl:text> </xsl:text>
</xsl:if>
<xsl:if test="lastName">
<xsl:value-of select="lastName"/>
"<xsl:text> </xsl:text>
</xsl:if>
<xsl:if test="generationalSuffix">
<xsl:value-of select="generationalSuffix"/>
</xsl:if>
</name>
<phone><xsl:value-of select="phone"/></phone>
</xsl:element>
</xsl:for-each>
我正在使用XSL -
这给了我想要的输出,除了当元素的值为NULL时无法处理尾随空格。
<phoneContact1>
<name>XXXXX Y ZZZZZ Jr.</name>
<phone>1234567890</phone>
</phoneContact1>
<phoneContact2>
<name>AAAA B CCCCC </name> <!-- notice the TRAILING space -->
<phone>9876543210</phone>
</phoneContact2>
有什么建议吗?谢谢。
答案 0 :(得分:3)
一个简单的解决方案是在连接值上使用normalize-space
,这样可以使样式表更加紧凑:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/action">
<xsl:for-each select="phoneContact">
<xsl:element name="{concat('phoneContact',position())}">
<name>
<xsl:value-of select="normalize-space(concat(firstName,' ',middleName,' ',lastName,' ',generationalSuffix))" />
</name>
<phone><xsl:value-of select="phone"/></phone>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果:
<?xml version="1.0"?>
<phoneContact1>
<name>XXXXX Y ZZZZZ Jr.</name><phone>1234567890</phone>
</phoneContact1>
<phoneContact2>
<name>AAAA B CCCCC</name><phone>9876543210</phone>
</phoneContact2>