XSLT分裂地址在换行符上

时间:2016-11-07 22:48:59

标签: xslt xslt-1.0

我有一个XML,地址如下:

<ADDRESS>SHIPPING ADDRESS 1
SHIPPING ADDRESS 2
SHIPPING ADDRESS 3</ADDRESS>

我需要将其转换为:

<ADDRESS1>SHIPPING ADDRESS 1</ADDRESS1>
<ADDRESS2>SHIPPING ADDRESS 2</ADDRESS2>

(忽略第三行)。

注意:我使用的是XSLT 1.0

2 个答案:

答案 0 :(得分:2)

如果你只想要前两行,你可以这样做:

<xsl:template match="ADDRESS">
    <ADDRESS1>
        <xsl:value-of select="substring-before(., '&#10;')" />
    </ADDRESS1>
    <ADDRESS2>
        <xsl:value-of select="substring-before(substring-after(., '&#10;'), '&#10;')" />    
    </ADDRESS2>
</xsl:template>

这假设至少有三行。否则会变得有点复杂。例如,您可以使用:

<xsl:template match="ADDRESS">
    <xsl:variable name="address" select="concat(., '&#10;&#10;')" />
    <ADDRESS1>
        <xsl:value-of select="substring-before($address, '&#10;')" />
    </ADDRESS1>
    <ADDRESS2>
        <xsl:value-of select="substring-before(substring-after($address, '&#10;'), '&#10;')" /> 
    </ADDRESS2>
</xsl:template>

创建两个地址行,无论源地址有多少行。

答案 1 :(得分:1)

这是另一个适用于任意行数的答案:

  <xsl:template match="ADDRESS">
    <xsl:call-template name="splitAddress">
      <xsl:with-param name="string" select="."/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="splitAddress">
    <xsl:param name="string"/>
    <xsl:param name="AddrNo" select="1"/>
    <xsl:choose>


  <xsl:when test="$AddrNo = 2">
    <xsl:element name="ADDRESS{$AddrNo}">
      <xsl:value-of select="substring-before($string, '&#10;')"/>
    </xsl:element>
  </xsl:when>


      <xsl:when test="contains($string, '&#10;')">
        <xsl:element name="ADDRESS{$AddrNo}">
          <xsl:value-of select="substring-before($string, '&#10;')"/>
        </xsl:element>
        <xsl:call-template name="splitAddress">
          <xsl:with-param name="string" select="substring-after($string, '&#10;')"/>
          <xsl:with-param name="AddrNo" select="$AddrNo + 1"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="ADDRESS{$AddrNo}">
          <xsl:value-of select="$string"/>
        </xsl:element>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

- Edit-- 我错过了在第二个地址线后停止的要求。我已插入上面的xsl:when以根据需要结束处理:此处的条件可以根据需要进行编辑。