XSLT将多个值连接成一个标记

时间:2016-03-03 20:03:55

标签: xml xslt

对于这个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 -

  1. 将电话联系人命名为不同的元素“phoneContact1”, “phoneContact2”,等等
  2. 将名称连接起来,每个名称字段由空格分隔。
  3. “名称”中不应有前导或尾随空格。
  4. 这给了我想要的输出,除了当元素的值为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>
    

    有什么建议吗?谢谢。

1 个答案:

答案 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>