当我尝试这个时,我的数据会排序,但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的新手并且正在努力。
答案 0 :(得分:0)
要了解“剥离标记”,您需要在XSLT中阅读built-in template rules。如果您没有与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"/>