获取具有不同值的节点的Xpath(删除尾随和前导空格)

时间:2015-05-09 11:14:47

标签: xml xslt xpath xalan

我有一个XML文档,其中我试图选择具有不同值的节点,其中删除了前导和尾随空格。

我正在使用关注Xpath并且它正在运行:

ROW[COUNTRY[not(text() = following::ROW/COUNTRY[text()])]]

但是当我在normalize-space(text())上方使用xpath时,返回的结果不正确。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <ROW>
        <COUNTRY>
            <![CDATA[USA]]>
        </COUNTRY>
        </ROW>
    <ROW>
        <COUNTRY>
            <![CDATA[ USA]]>
        </COUNTRY>
    </ROW>
</ROOT>

XSLT:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" indent="yes" />
  <xsl:template match="@*|node()">
    <xsl:apply-templates select="@*|node()" />
  </xsl:template>

  <xsl:template match="ROW[COUNTRY[not(normalize-space(text()) = following::ROW/COUNTRY[normalize-space(text())])]]">
    <tr>
        <xsl:value-of select="normalize-space(./COUNTRY)"></xsl:value-of>
    </tr>
  </xsl:template>
</xsl:transform>

1 个答案:

答案 0 :(得分:3)

使用Muenchian分组:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" indent="yes" />

  <xsl:key name="group" match="ROW" use="normalize-space(COUNTRY)"/>

  <xsl:template match="@*|node()">
    <xsl:apply-templates select="@*|node()" />
  </xsl:template>

  <xsl:template match="ROW[generate-id() = generate-id(key('group', normalize-space(COUNTRY))[1])]">
    <tr>
        <xsl:value-of select="normalize-space(./COUNTRY)"></xsl:value-of>
    </tr>
  </xsl:template>
</xsl:transform>