-1

当我尝试这个时,我的数据排序,但 XML 标记被剥离。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
 <xsl:template match="searchResults/searchResult">
  <xsl:copy>
   <xsl:apply-templates>
     <xsl:sort select="//TSN" order="descending"/>
   </xsl:apply-templates>
 </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

当我这样做时,XML 输出格式是正确的,但它没有排序。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
 <xsl:template match="node()">
  <xsl:copy>
   <xsl:apply-templates>
     <xsl:sort select="//TSN" order="descending"/>
   </xsl:apply-templates>
 </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

这是我的 XML 示例:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <info><statusCode>0</statusCode><messages/></info>
    <search>
        <options><maxMatches>100</maxMatches><units>m</units></options>
        <resultsCount>3</resultsCount>
        <totalPages>1</totalPages>
        <searchResults>
            <searchResult>
                <resultNumber>1</resultNumber>
                <fields>
                    <LocationState>OK</LocationState><TSN>N</TSN><LocationCity>TULSA</LocationCity>
                </fields>
            </searchResult>
            <searchResult>
                <resultNumber>2</resultNumber>
                <fields>
                    <LocationState>OK</LocationState><TSN>Y</TSN><LocationCity>BIXBY</LocationCity>
                </fields>
            </searchResult>
            <searchResult>
                <resultNumber>3</resultNumber>
                <fields>
                    <LocationState>OK</LocationState><TSN>N</TSN><LocationCity>COWETA</LocationCity>
                </fields>
            </searchResult>
        </searchResults>
        <origin><adminArea3 type="State">OK</adminArea3></origin>
    </search>
</response>

有任何想法吗?我是 XSLT 的新手并且正在苦苦挣扎。

4

1 回答 1

0

要了解“去除标记”,您需要阅读XSLT中的内置模板规则。这些是在您没有与 XSLT 中的节点匹配的特定模板时使用的模板。如果是文本节点(或属性),内置模板将输出节点的文本,否则将跳过该节点并继续寻找与子节点匹配的模板。

在您的第一个 XSLT 中,您拥有的唯一模板与searchResults/searchResult匹配,因此这是唯一将被复制的元素。所有其他节点将由内置模板匹配,因此只会输出文本,而不是元素本身。

在您的第二个 XSLT 中,模板与node()匹配,这显然会匹配任何节点。因此xsl:copy将用于它匹配的所有节点以输出它们。

至于排序,这与您使用的 XPath 表达式有关

<xsl:sort select="//TSN" order="descending"/>

当 Xpath 表达式以正斜杠开头时,这意味着它将是一个绝对路径,从顶级文档节点开始。当您有两个正斜杠时,它将在顶级文档节点下的任何级别搜索节点。换句话说,表达式与您选择的searchResult元素的子节点无关;它还将返回 XML 中第一个TSN元素的值。因此,由于排序是为每个孩子选择相同的值,所以不进行排序。

至于正确的表达式应该是什么,如果没有看到您的输入 XML 就不可能说出来,但作为猜测,它可能只是这样......

<xsl:sort select="TSN" order="descending"/>
于 2013-09-14T08:03:46.650 回答