如何为一组值修改XML和XSLT?

时间:2015-08-20 23:40:16

标签: xml xslt collections

以下是我得到的数据:

<AddressIDs>
                    <AddressID IDType="ABC_1">
                        <HNumber>YYY_1</HNumber>
                    </AddressID>
                    <AddressID IDType="ABC_2">
                        <HNumber>YYY_2</HNumber>
                    </AddressID>
                    <AddressID IDType="ABC_3">
                        <HNumber>YYY_3</HNumber>
                    </AddressID>
                    <AddressID IDType="ABC_4">
                        <HNumber>YYY_4</HNumber>
                    </AddressID>
                </AddressIDs>

我必须在我的页面上显示如下内容,HNumber:YY_1 | YYY_2 | YYY_3 | YYY_4。

这就是我编写XML和XSLT的方法:

XML:

<AddressID Label="HNumber:" XPath="AddressIDs/AddressID" IDType="ABC_*">
    <HNumber XPath="AddressIDs/AddressID/HNumber"></HNumber>
  </AddressID>

XSLT:

<label>HNumber:</label>
          <label>
<xsl:choose>
<xsl:when test="AddressIDs/AddressID [contains(@IDType,'ABC_')]!=''">
<xsl:value-of select="concat(AddressIDs/AddressID [contains(@IDType,'ABC_')]/HNumber,'|')"/>
              </xsl:when>
              <xsl:otherwise>
                <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
              </xsl:otherwise>
            </xsl:choose>
          </label>

请建议这是否正确。

1 个答案:

答案 0 :(得分:0)

concat函数将字符串连接在一起。如果其中一个参数是xpath表达式,它将使用该表达式返回的第一个节点的值。

如果您使用的是XSLT 1.0,一种解决方案是使用xsl:for-each来选择所有节点,并以此方式构建字符串。例如

<xsl:for-each select="AddressIDs/AddressID [starts-with(@IDType,'ABC_')]/HNumber">
   <xsl:if test="position() > 1">|</xsl:if>
   <xsl:value-of select="." />
</xsl:for-each>

但是,如果您使用的是XSLT 2.0,则可以使用separator上的xsl:value-of属性,如下所示:

<xsl:value-of select="AddressIDs/AddressID [starts-with(@IDType,'ABC_')]/HNumber" separator="|" />