如何将 xml 属性传递给 xslt 参数?
除了 ctrlname 列之外,我一切正常(感谢 empo)。我不太了解语法。我想做的是使用 xslt 按列名称对 gridview 中的 xml 进行排序。除了 ctrlname 列之外,一切正常。如何将属性传递给 XSLT?我尝试过:@name、Data/@name、Data[@name]、ctrlname。什么都不起作用。
XmlDataSource1.EnableCaching = False
Dim xslTrnsform As System.Xml.Xsl.XsltArgumentList = New System.Xml.Xsl.XsltArgumentList
xslTrnsform.AddParam("sortby", "", sortAttr)
xslTrnsform.AddParam("orderas", "", orderby)
XmlDataSource1.TransformArgumentList = xslTrnsform
XmlDataSource1.DataFile = "~/App_LocalResources/DST_Test.xml"
XmlDataSource1.XPath = "//data"
XmlDataSource1.TransformFile = xsltFileName
'XmlDataSource1.DataBind()
GridView1.DataSource = XmlDataSource1
GridView1.DataBind()
XSL
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:param name="sortby"></xsl:param>
<xsl:param name="orderas"></xsl:param>
<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="data">
<xsl:sort select="*[name()=$sortby]" data-type="text" order="{$orderas}"/>
</xsl:apply-templates>
</root>
</xsl:template>
<xsl:template match="data">
<data>
<xsl:attribute name="ctrlname">
<xsl:value-of select="@name"/>
</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="value" />
</xsl:attribute>
<xsl:attribute name="comment">
<xsl:value-of select="comment" />
</xsl:attribute>
</data>
</xsl:template>
</xsl:stylesheet>
XML 输入
<?xml version="1.0" encoding="utf-8" ?>
<root>
<data name="Test1.Text" xml:space="preserve">
<value>Please Pick Bare Pump</value>
<comment>Tab - Pump Configuration</comment>
</data>
<data name="Test2.Text" xml:space="preserve">
<value>Complete</value>
<comment>A07</comment>
</data>
<data name="Test3.Text" xml:space="preserve">
<value>Confirmed</value>
<comment>A01</comment>
</data>
</root>
I got everything working (thank empo) except the ctrlname column. I don't know the syntax well enough. What I am trying to do is use the xslt to sort the xml in the gridview by the column name. Everything is working but the ctrlname column. How do I pass an attribute to the XSLT? I've tried: @name, Data/@name, Data[@name], ctrlname. Nothing works.
XmlDataSource1.EnableCaching = False
Dim xslTrnsform As System.Xml.Xsl.XsltArgumentList = New System.Xml.Xsl.XsltArgumentList
xslTrnsform.AddParam("sortby", "", sortAttr)
xslTrnsform.AddParam("orderas", "", orderby)
XmlDataSource1.TransformArgumentList = xslTrnsform
XmlDataSource1.DataFile = "~/App_LocalResources/DST_Test.xml"
XmlDataSource1.XPath = "//data"
XmlDataSource1.TransformFile = xsltFileName
'XmlDataSource1.DataBind()
GridView1.DataSource = XmlDataSource1
GridView1.DataBind()
XSL
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:param name="sortby"></xsl:param>
<xsl:param name="orderas"></xsl:param>
<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="data">
<xsl:sort select="*[name()=$sortby]" data-type="text" order="{$orderas}"/>
</xsl:apply-templates>
</root>
</xsl:template>
<xsl:template match="data">
<data>
<xsl:attribute name="ctrlname">
<xsl:value-of select="@name"/>
</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="value" />
</xsl:attribute>
<xsl:attribute name="comment">
<xsl:value-of select="comment" />
</xsl:attribute>
</data>
</xsl:template>
</xsl:stylesheet>
XML input
<?xml version="1.0" encoding="utf-8" ?>
<root>
<data name="Test1.Text" xml:space="preserve">
<value>Please Pick Bare Pump</value>
<comment>Tab - Pump Configuration</comment>
</data>
<data name="Test2.Text" xml:space="preserve">
<value>Complete</value>
<comment>A07</comment>
</data>
<data name="Test3.Text" xml:space="preserve">
<value>Confirmed</value>
<comment>A01</comment>
</data>
</root>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
当前接受的答案有一个缺陷:只要
data
的属性与data
的子元素同名,排序就会始终使用属性的值作为键来执行。而且,它太长了。此解决方案解决了问题(并且更短),允许指定应按属性名称还是按元素名称排序:
当应用于此 XML 文档时(基于在提供的结果上,但变得更有趣):
生成正确的结果(按
name
属性排序):现在,替换 < code>with :
并在同一个 XML 文档上再次应用转换。这次我们得到了按子元素的值正确排序的结果
name
:解释:
为了区分无论我们要按子元素排序还是按属性排序,我们都使用以下约定:
elem!someName
意味着排序必须按名为someName
的子元素的值进行排序>。同样,attrib!someName
表示排序必须按名为someName
的属性的值进行。
指令进行相应修改,以正确选择属性或子元素作为键。不允许有歧义,因为sortby
参数的起始子字符串现在唯一标识该键应该是属性还是子元素。The currently accepted answer has one flaw: Whenever there is an attribute of
data
with the same name as a child element ofdata
, the sort will always be performed using as keys the values of the attribute. Also, it is too long.This solution solves the problem (and is shorter) allowing to specify whether the sort should be by attribute-name or by element-name:
When applied on this XML document (based on the provided one, but made a little-bit more interesting):
the correct result (sorted by the
name
attribute) is produced:Now, replace the
<xsl:param name="sortby" select="'attrib!name'"/>
with:and apply the transformation again on the same XML document. This time we get the result correctly sorted by the values of the child-element
name
:Explanation:
To distinguish whether we want to sort by an element-child or by an attribute, we use the convention that
elem!someName
means the sort must be by the values of a child element namedsomeName
. Similarly,attrib!someName
means the sort must be by the values of an attribute namedsomeName
.The
<xsl:sort>
insruction is modified accordingly to select as key correctly either an attribute or a child element. No ambiguity is allowed, because the starting substring of thesortby
parameter now uniquely identifies whether the key should be an attribute or a child element.是的,很抱歉没有注意到您还想按属性排序。另请注意,您已更改了
xsl:param
的语法,这种方式是不正确的。将单引号保留在双引号内非常重要。这是最终的模板:Yes, I'm sorry didnt notice that you wanted also sort by attributes. Note also that you have changed the syntax of
xsl:param
and it's not correct in that way. It's very important that you keep the single quotes inside the double ones. Here is the final template:好的,我认为这应该适合您,允许您在 $sortby 参数中指定属性或元素名称:(
您只需传入“name”作为 $sortby 参数的值)
问题是排序值节点选择仅匹配元素(
*
仅匹配元素)。OK, I think this should work for you, allowing you to specify either attribute or element names in the $sortby parameter:
(you would just pass in "name" as the value of the $sortby parameter)
The problem was that the sort value node selection was only matching elements (
*
matches elements only).