2011-11-03 91 views
1

基本上,发生的事情是XML节点本身没有改变位置。所以我觉得我的XSLT错过了一些东西。这是使用XSLT进行排序的正确方法吗?

XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:asp="http://test.com/asp" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="root"> 
     <root> 
      <xsl:apply-templates select="asp:TableRow"> 
       <xsl:sort select="@ID" data-type="text" order="ascending"/> 
      </xsl:apply-templates> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<Root xmlns:asp="http://test.com/asp" xmlns:meta="http://test.com/meta" xmlns:cc1="http://test.com/cc1"> 
    <asp:TableRow ID="A02"> 
    <asp:TableCell> 
     <asp:Localize ID="tagthreeCtrlNumberRes" meta:resourcekey="tagthreeCtrlNumberRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagthreeCtrlDescRes" meta:resourcekey="tagthreeCtrlDescRes" runat="server" /> 
     <asp:Localize ID="tagthreeCtrlNoteRes" meta:resourcekey="tagthreeCtrlNoteRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:RadioButtonList ID="rblthreeCtrlRes0" RepeatDirection="Horizontal" runat="server"> 
     <asp:ListItem Text="Yes" meta:resourcekey="rblthreeCtrl0Res0" Value="1" /> 
     <asp:ListItem Text="No" meta:resourcekey="rblthreeCtrl1Res0" Value="0" /> 
     <asp:ListItem Text="N/A" meta:resourcekey="rblthreeCtrl2Res0" Value="2" /> 
     </asp:RadioButtonList> 
     <asp:RadioButtonList ID="rblthreeCtrlRes1" RepeatDirection="Horizontal" runat="server"> 
     <asp:ListItem Text="Yes" meta:resourcekey="rblthreeCtrl0Res1" Value="1" /> 
     <asp:ListItem Text="No" meta:resourcekey="rblthreeCtrl1Res1" Value="0" /> 
     <asp:ListItem Text="N/A" meta:resourcekey="rblthreeCtrl2Res1" Value="2" /> 
     </asp:RadioButtonList> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdthreeCtrlRes" meta:resourcekey="cmdthreeCtrlRes" runat="server" OnClick="FormDataSave_Click" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmthreeCtrlRes" meta:resourcekey="lblAssmthreeCtrlRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblQualthreeCtrlRes" meta:resourcekey="lblQualthreeCtrlRes" runat="server" /> 
     <asp:Button ID="cmdQualAcceptthreeCtrlRes" meta:resourcekey="cmdQualAcceptthreeCtrlRes" OnClick="cmdQualAccept_Click" runat="server" Text="Accept" Visible="True" /> 
    </asp:TableCell> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    </asp:TableRow> 
    <asp:TableRow ID="A01"> 
    <asp:TableCell> 
     <asp:Localize ID="tagtwoCtrlNumberRes" meta:resourcekey="tagtwoCtrlNumberRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtwoCtrlDescRes" meta:resourcekey="tagtwoCtrlDescRes" runat="server" /> 
     <asp:Localize ID="tagtwoCtrlNoteRes" meta:resourcekey="tagtwoCtrlNoteRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtxttwoCtrlRes0" meta:resourcekey="tagtxttwoCtrlRes0" runat="server" /> 
     <asp:Textbox ID="txttwoCtrlRes0" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdtwoCtrlRes" meta:resourcekey="cmdtwoCtrlRes" runat="server" OnClick="FormDataSave_Click" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmtwoCtrlRes" meta:resourcekey="lblAssmtwoCtrlRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    </asp:TableRow> 
    <asp:TableRow ID="A03"> 
    <asp:TableCell> 
     <asp:Localize ID="tagoneCtrlNumberRes" meta:resourcekey="tagoneCtrlNumberRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagoneCtrlDescRes" meta:resourcekey="tagoneCtrlDescRes" runat="server" /> 
     <asp:Localize ID="tagoneCtrlNoteRes" meta:resourcekey="tagoneCtrlNoteRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtxtoneCtrlRes0" meta:resourcekey="tagtxtoneCtrlRes0" runat="server" /> 
     <asp:Textbox ID="txtoneCtrlRes0" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdoneCtrlRes" meta:resourcekey="cmdoneCtrlRes" runat="server" OnClick="FormDataSave_Click" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmoneCtrlRes" meta:resourcekey="lblAssmoneCtrlRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    </asp:TableRow> 
</Root> 

代码隐藏:

For Each deleteChild As XmlNode In rootDoc.DocumentElement.ChildNodes 
    rootDoc.DocumentElement.RemoveChild(deleteChild) 
Next 

'List (Of XMLNode)' 
For Each markupElem As XmlElement In allNodes 
    rootDoc.DocumentElement.AppendChild(markupElem) 
Next 

'List (Of XMLNode)' 
For Each markupElem As XmlElement In nodesToMove 
    rootDoc.DocumentElement.AppendChild(markupElem) 
Next 

Dim sortXmlDoc As Xsl.XslCompiledTransform = New Xsl.XslCompiledTransform(True) 
sortXmlDoc.Load(xsltPath) 

Dim saveWriter As XmlTextWriter = New XmlTextWriter(truePath, Nothing) 
sortXmlDoc.Transform(rootDoc, saveWriter) 
saveWriter.Close() 

回答

2

有与所提供的代码两个明显的问题:

  1. 代码中唯一的模板与root匹配,但在提供的XML元素中根本没有root元素 - 因此该模板根本没有被选中执行。

  2. 提供的XML文档中的元素没有文本节点子元素。由于提供的XSLT代码中没有任何其他模板,因此在处理XML文档时仅使用内置的XSLT模板。它们的效果是仅将文本节点复制到输出 - 因此没有产生任何输出。

解决方案

  1. 变化match='root'match='Root'

  2. 添加标识规则,以便每个节点都将被复制。

已经应用这两个修正你的代码变得

<Root xmlns:asp="http://test.com/asp" xmlns:meta="http://test.com/meta" xmlns:cc1="http://test.com/cc1"> 
    <asp:TableRow ID="A02"> 
    <asp:TableCell> 
     <asp:Localize ID="tagthreeCtrlNumberRes" meta:resourcekey="tagthreeCtrlNumberRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagthreeCtrlDescRes" meta:resourcekey="tagthreeCtrlDescRes" runat="server" /> 
     <asp:Localize ID="tagthreeCtrlNoteRes" meta:resourcekey="tagthreeCtrlNoteRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:RadioButtonList ID="rblthreeCtrlRes0" RepeatDirection="Horizontal" runat="server"> 
     <asp:ListItem Text="Yes" meta:resourcekey="rblthreeCtrl0Res0" Value="1" /> 
     <asp:ListItem Text="No" meta:resourcekey="rblthreeCtrl1Res0" Value="0" /> 
     <asp:ListItem Text="N/A" meta:resourcekey="rblthreeCtrl2Res0" Value="2" /> 
     </asp:RadioButtonList> 
     <asp:RadioButtonList ID="rblthreeCtrlRes1" RepeatDirection="Horizontal" runat="server"> 
     <asp:ListItem Text="Yes" meta:resourcekey="rblthreeCtrl0Res1" Value="1" /> 
     <asp:ListItem Text="No" meta:resourcekey="rblthreeCtrl1Res1" Value="0" /> 
     <asp:ListItem Text="N/A" meta:resourcekey="rblthreeCtrl2Res1" Value="2" /> 
     </asp:RadioButtonList> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdthreeCtrlRes" meta:resourcekey="cmdthreeCtrlRes" runat="server" OnClick="FormDataSave_Click" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmthreeCtrlRes" meta:resourcekey="lblAssmthreeCtrlRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblQualthreeCtrlRes" meta:resourcekey="lblQualthreeCtrlRes" runat="server" /> 
     <asp:Button ID="cmdQualAcceptthreeCtrlRes" meta:resourcekey="cmdQualAcceptthreeCtrlRes" OnClick="cmdQualAccept_Click" runat="server" Text="Accept" Visible="True" /> 
    </asp:TableCell> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    </asp:TableRow> 
    <asp:TableRow ID="A01"> 
    <asp:TableCell> 
     <asp:Localize ID="tagtwoCtrlNumberRes" meta:resourcekey="tagtwoCtrlNumberRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtwoCtrlDescRes" meta:resourcekey="tagtwoCtrlDescRes" runat="server" /> 
     <asp:Localize ID="tagtwoCtrlNoteRes" meta:resourcekey="tagtwoCtrlNoteRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtxttwoCtrlRes0" meta:resourcekey="tagtxttwoCtrlRes0" runat="server" /> 
     <asp:Textbox ID="txttwoCtrlRes0" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdtwoCtrlRes" meta:resourcekey="cmdtwoCtrlRes" runat="server" OnClick="FormDataSave_Click" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmtwoCtrlRes" meta:resourcekey="lblAssmtwoCtrlRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    </asp:TableRow> 
    <asp:TableRow ID="A03"> 
    <asp:TableCell> 
     <asp:Localize ID="tagoneCtrlNumberRes" meta:resourcekey="tagoneCtrlNumberRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagoneCtrlDescRes" meta:resourcekey="tagoneCtrlDescRes" runat="server" /> 
     <asp:Localize ID="tagoneCtrlNoteRes" meta:resourcekey="tagoneCtrlNoteRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtxtoneCtrlRes0" meta:resourcekey="tagtxtoneCtrlRes0" runat="server" /> 
     <asp:Textbox ID="txtoneCtrlRes0" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdoneCtrlRes" meta:resourcekey="cmdoneCtrlRes" runat="server" OnClick="FormDataSave_Click" /> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmoneCtrlRes" meta:resourcekey="lblAssmoneCtrlRes" runat="server" /> 
    </asp:TableCell> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    <asp:TableCell /> 
    </asp:TableRow> 
</Root> 

想要的,正确的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:asp="http://test.com/asp" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 

    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="Root"> 
     <root> 
      <xsl:apply-templates select="asp:TableRow"> 
       <xsl:sort select="@ID" data-type="text" order="ascending"/> 
      </xsl:apply-templates> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

当所提供的XML文档应用(排序)结果产生

<?xml version="1.0" encoding="UTF-16"?> 
<root xmlns:asp="http://test.com/asp"> 
<asp:TableRow ID="A01" xmlns:meta="http://test.com/meta" xmlns:cc1="http://test.com/cc1"> 
    <asp:TableCell> 
     <asp:Localize ID="tagtwoCtrlNumberRes" meta:resourcekey="tagtwoCtrlNumberRes" runat="server"></asp:Localize> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtwoCtrlDescRes" meta:resourcekey="tagtwoCtrlDescRes" runat="server"></asp:Localize> 
     <asp:Localize ID="tagtwoCtrlNoteRes" meta:resourcekey="tagtwoCtrlNoteRes" runat="server"></asp:Localize> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtxttwoCtrlRes0" meta:resourcekey="tagtxttwoCtrlRes0" runat="server"></asp:Localize> 
     <asp:Textbox ID="txttwoCtrlRes0" runat="server"></asp:Textbox> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdtwoCtrlRes" meta:resourcekey="cmdtwoCtrlRes" runat="server" OnClick="FormDataSave_Click"></asp:Button> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmtwoCtrlRes" meta:resourcekey="lblAssmtwoCtrlRes" runat="server"></asp:Localize> 
    </asp:TableCell> 
    <asp:TableCell></asp:TableCell> 
    <asp:TableCell></asp:TableCell> 
    <asp:TableCell></asp:TableCell> 
    </asp:TableRow> 
<asp:TableRow ID="A02" xmlns:meta="http://test.com/meta" xmlns:cc1="http://test.com/cc1"> 
    <asp:TableCell> 
     <asp:Localize ID="tagthreeCtrlNumberRes" meta:resourcekey="tagthreeCtrlNumberRes" runat="server"></asp:Localize> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagthreeCtrlDescRes" meta:resourcekey="tagthreeCtrlDescRes" runat="server"></asp:Localize> 
     <asp:Localize ID="tagthreeCtrlNoteRes" meta:resourcekey="tagthreeCtrlNoteRes" runat="server"></asp:Localize> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:RadioButtonList ID="rblthreeCtrlRes0" RepeatDirection="Horizontal" runat="server"> 
     <asp:ListItem Text="Yes" meta:resourcekey="rblthreeCtrl0Res0" Value="1"></asp:ListItem> 
     <asp:ListItem Text="No" meta:resourcekey="rblthreeCtrl1Res0" Value="0"></asp:ListItem> 
     <asp:ListItem Text="N/A" meta:resourcekey="rblthreeCtrl2Res0" Value="2"></asp:ListItem> 
     </asp:RadioButtonList> 
     <asp:RadioButtonList ID="rblthreeCtrlRes1" RepeatDirection="Horizontal" runat="server"> 
     <asp:ListItem Text="Yes" meta:resourcekey="rblthreeCtrl0Res1" Value="1"></asp:ListItem> 
     <asp:ListItem Text="No" meta:resourcekey="rblthreeCtrl1Res1" Value="0"></asp:ListItem> 
     <asp:ListItem Text="N/A" meta:resourcekey="rblthreeCtrl2Res1" Value="2"></asp:ListItem> 
     </asp:RadioButtonList> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdthreeCtrlRes" meta:resourcekey="cmdthreeCtrlRes" runat="server" OnClick="FormDataSave_Click"></asp:Button> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmthreeCtrlRes" meta:resourcekey="lblAssmthreeCtrlRes" runat="server"></asp:Localize> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblQualthreeCtrlRes" meta:resourcekey="lblQualthreeCtrlRes" runat="server"></asp:Localize> 
     <asp:Button ID="cmdQualAcceptthreeCtrlRes" meta:resourcekey="cmdQualAcceptthreeCtrlRes" OnClick="cmdQualAccept_Click" runat="server" Text="Accept" Visible="True"></asp:Button> 
    </asp:TableCell> 
    <asp:TableCell></asp:TableCell> 
    <asp:TableCell></asp:TableCell> 
    </asp:TableRow> 
<asp:TableRow ID="A03" xmlns:meta="http://test.com/meta" xmlns:cc1="http://test.com/cc1"> 
    <asp:TableCell> 
     <asp:Localize ID="tagoneCtrlNumberRes" meta:resourcekey="tagoneCtrlNumberRes" runat="server"></asp:Localize> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagoneCtrlDescRes" meta:resourcekey="tagoneCtrlDescRes" runat="server"></asp:Localize> 
     <asp:Localize ID="tagoneCtrlNoteRes" meta:resourcekey="tagoneCtrlNoteRes" runat="server"></asp:Localize> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="tagtxtoneCtrlRes0" meta:resourcekey="tagtxtoneCtrlRes0" runat="server"></asp:Localize> 
     <asp:Textbox ID="txtoneCtrlRes0" runat="server"></asp:Textbox> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Button ID="cmdoneCtrlRes" meta:resourcekey="cmdoneCtrlRes" runat="server" OnClick="FormDataSave_Click"></asp:Button> 
    </asp:TableCell> 
    <asp:TableCell> 
     <asp:Localize ID="lblAssmoneCtrlRes" meta:resourcekey="lblAssmoneCtrlRes" runat="server"></asp:Localize> 
    </asp:TableCell> 
    <asp:TableCell></asp:TableCell> 
    <asp:TableCell></asp:TableCell> 
    <asp:TableCell></asp:TableCell> 
    </asp:TableRow> 
</root> 
0

@Dimitre:再次感谢你,帮助我。你有书还是什么?我会买它。我必须对代码隐藏进行更改。这是变化:

Dim xsltPath As String = Server.MapPath(xsltFileName3) 

Dim sortXmlDoc As Xsl.XslCompiledTransform = New Xsl.XslCompiledTransform(True) 
sortXmlDoc.Load(xsltPath) 
Dim output = sortXmlDoc.OutputSettings 

Dim saveWriter As XmlWriter = XmlWriter.Create(truePath, output) 
sortXmlDoc.Transform(markup, saveWriter) 
saveWriter.Close() 

变量“标记”是一个XmlDocument。在写入XmlWriter后,我发现我无法做标记。保存。它会将数据再次写入XML文件,并且顺序也是错误的。由于代码隐藏的行为方式,我对XSLT做了一些小改动。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:asp="http://test.com/asp" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 

    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="Root"> 
     <Root xmlns:asp="http://test.com/asp" xmlns:meta="http://test.com/meta" xmlns:cc1="http://test.com/cc1"> 
      <xsl:apply-templates select="asp:TableRow"> 
       <xsl:sort select="@ID" data-type="text" order="ascending"/> 
      </xsl:apply-templates> 
     </Root> 
    </xsl:template> 

</xsl:stylesheet> 
+0

@ _dotnetN00b:不客气。 (我有我在这里的XSLT/XPAth书的建议:http://stackoverflow.com/questions/339930/any-good-xslt-tutorial-book-blog-site-online/341589#341589 –

相关问题