Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用XSL对XML文件的一部分进行排序_Xml_Sorting_Xslt - Fatal编程技术网

如何使用XSL对XML文件的一部分进行排序

如何使用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

我正在尝试使用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-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
where
Name=“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
where
Name=“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" />

这是正确的。(
数据类型
的添加是因为它是一种良好的做法,而不是因为它是严格必需的。
文本
是默认值。)