如何使用XSL对XML文件的一部分进行排序
我正在尝试使用XSL对XML文件进行排序。我对XSL非常陌生,已经编写了一个.Net应用程序,将XSL应用于XML并将其保存到一个新文件中。这个很好用。XML的简化版本如下所示(精明的读者会注意到它是一个ManagementStudio项目文件):如何使用XSL对XML文件的一部分进行排序,xml,sorting,xslt,Xml,Sorting,Xslt,我正在尝试使用XSL对XML文件进行排序。我对XSL非常陌生,已经编写了一个.Net应用程序,将XSL应用于XML并将其保存到一个新文件中。这个很好用。XML的简化版本如下所示(精明的读者会注意到它是一个ManagementStudio项目文件): 2013-06-28815:50:27.919788+01:00 SQL 地狱犬 Windows身份验证 主人 15 0 未指定 Microsoft SQL Server Management Studio-查询 8c91a03d-f9b4-46c
2013-06-28815:50:27.919788+01:00
SQL
地狱犬
Windows身份验证
主人
15
0
未指定
Microsoft SQL Server Management Studio-查询
8c91a03d-f9b4-46c0-a305-b5dcc79ff907:tyro:True
初学者
PMI193_Documents.sql
8c91a03d-f9b4-46c0-a305-b5dcc79ff907:cerberus:正确
地狱犬
PMI002_EventTypes.sql
8c91a03d-f9b4-46c0-a305-b5dcc79ff907:tyro:True
初学者
PMI079a_维度筛选详细信息.sql
$/DataWarehouse/Dev/Reports
..
团队基础服务器MSSCI提供商
您将注意到有几个LogicalFolder部分。我只想对属性Name=“querys”所在的元素进行排序,我希望它按子元素Items/FileNode/FullPath进行排序
我采用了一些XSL,即标识XSL,并对其进行了扩展。它会复制原始文件,但不会对我希望它排序的部分进行排序(事实上,它似乎什么也没有排序)。我创建的XSL如下所示:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/ | @* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/SqlWorkbenchSqlPro/Items/LogicalFolder/Items">
<xsl:apply-templates select=".">
<xsl:sort select="FullPath"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
我不知道如何指定我只对/SqlWorkbenchSqlPro/Items/LogicalFolder/Items where Name=“querys”部分进行排序,如何指定要排序的元素级别,以及如何指定要使用哪个元素对项目进行排序。真的,我一点都不擅长XSL,因为我几小时前才开始研究它
非常感谢您的帮助。我很头痛。事实上,您已经建立了身份模板,这是一个良好的开端,因此您离此不远了。您遇到的第一个问题是,模板引用了
SqlWorkbenchSqlPro
,但在XML中它是SqlWorkbenchSqlProject
,因此与任何内容都不匹配
但现在还不要去纠正它,因为如果你单独这么做,你的模板就会陷入一个循环中。使用
只会选择相同的匹配模板。您应该在这里执行
,或者只执行
但要回答您的主要问题,您可以在方括号中添加一个条件,以目标节点为目标
<xsl:template match="LogicalFolder[@Name='Queries']/Items">
注意:此处不需要指定节点的完整路径
试试这个XSLT
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:strip-space elements="*" />
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="LogicalFolder[@Name='Queries']/Items">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="FullPath"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意,在
Items
模板中使用xsl:copy
,在选择和排序其子节点之前复制现有的Items
元素。基于标识模板构建的事实是一个很好的开端,因此您已经不远了。您遇到的第一个问题是,模板引用了SqlWorkbenchSqlPro
,但在XML中它是SqlWorkbenchSqlProject
,因此与任何内容都不匹配
但现在还不要去纠正它,因为如果你单独这么做,你的模板就会陷入一个循环中。使用
只会选择相同的匹配模板。您应该在这里执行
,或者只执行
但要回答您的主要问题,您可以在方括号中添加一个条件,以目标节点为目标
<xsl:template match="LogicalFolder[@Name='Queries']/Items">
注意:此处不需要指定节点的完整路径
试试这个XSLT
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:strip-space elements="*" />
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="LogicalFolder[@Name='Queries']/Items">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="FullPath"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意,在Items
模板中使用xsl:copy
,在选择和排序其子节点之前复制现有的Items
元素
如何指定我只对节LogicalFolder/Items
whereName=“querys”
那很容易。制作模板,使其仅与此特定类型的节点匹配
<xsl:template match="LogicalFolder[@Name = 'Queries']/Items">
<xsl:copy>
<xsl:apply-templates select="*">
<xsl:sort select="FullPath" data-type="text" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
无需进行其他更改,XSLT处理器将为您执行递归。(
是递归步骤)
以及如何指定用于对项目进行排序的元素
中的select表达式始终与正在排序的节点相关。综上所述,
<xsl:apply-templates select="*">
选择一组
元素,这意味着
<xsl:sort select="FullPath" data-type="text" />
这是正确的。(数据类型
的添加是因为它是一种良好的做法,而不是因为它是严格必需的。文本
是默认值。)
如何指定我只对节LogicalFolder/Items
whereName=“querys”
那很容易。制作模板,使其仅与此特定类型的节点匹配
<xsl:template match="LogicalFolder[@Name = 'Queries']/Items">
<xsl:copy>
<xsl:apply-templates select="*">
<xsl:sort select="FullPath" data-type="text" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
无需进行其他更改,XSLT处理器将为您执行递归。(
是递归步骤)
以及如何指定用于对项目进行排序的元素
中的select表达式始终与正在排序的节点相关。综上所述,
<xsl:apply-templates select="*">
选择一组
元素,这意味着
<xsl:sort select="FullPath" data-type="text" />
这是正确的。(数据类型
的添加是因为它是一种良好的做法,而不是因为它是严格必需的。文本
是默认值。)