【问题标题】:XSLT split address on line breakXSLT 在换行符处拆分地址
【发布时间】:2016-11-07 22:48:58
【问题描述】:

我有一个地址如下的 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

【问题讨论】:

  • 您使用的是哪种 XSLT 1.0 处理器?
  • @michael.hor257k 我是 XSLT 新手,不确定答案。它被 C# 应用程序调用。

标签: xslt xslt-1.0


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这不会忽略 OP 要求的第三行。
    • 完成:抱歉错过了。我认为最好使用 xsl:when (为了便于阅读,我已将其分离到自己的行)来设置可编辑的停止条件,以防您以后需要更改要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多