我如何通过一个XML属性为XSLT参数? [英] How do I pass a xml attribute to xslt parameter?
问题描述
我除了ctrlname列的一切工作(感谢EMPO)。我不知道语法不够好。我所要做的是使用XSLT被列名在GridView的XML进行排序。一切正常,但ctrlname列。我如何传递给XSLT属性?我试过:@name,数据/ @名称,数据[@name],ctrlname。没有什么作品。
XmlDataSource1.EnableCaching =假
昏暗xslTrnsform作为System.Xml.Xsl.XsltArgumentList =新System.Xml.Xsl.XsltArgumentList
xslTrnsform.AddParam(sortby,,sortAttr)
xslTrnsform.AddParam(orderas,,的OrderBy)
XmlDataSource1.TransformArgumentList = xslTrnsform
XmlDataSource1.DataFile =〜/ App_LocalResources文件/ DST_Test.xml
XmlDataSource1.XPath =//数据
XmlDataSource1.TransformFile = xsltFileName
XmlDataSource1.DataBind()
GridView1.DataSource = XmlDataSource1
GridView1.DataBind()
XSL
<?XML版本=1.0编码=UTF-8&GT?;
<的xsl:样式版本=1.0的xmlns:XSL =http://www.w3.org/1999/XSL/Transform
的xmlns:msxsl =瓮:架构 - 微软COM:XSLT排除-result- prefixes =msxsl> < XSL:PARAM NAME =sortby>< / XSL:参数>
< XSL:PARAM NAME =orderas>< / XSL:参数> < XSL:输出方法=XML缩进=YES/> !< - <的xsl:模板匹配=@ * |节点()>
< XSL:复制>
< XSL:申请模板选择=@ * |节点()/>
< / XSL:复制>
< / XSL:模板> - >
<的xsl:模板匹配=根>
<根和GT;
< XSL:申请模板选择=数据>
< XSL:排序选择=* [名称()= $ sortby]数据类型=文本命令={$ orderas}/>
< / XSL:申请模板>
< /根>
< / XSL:模板>
<的xsl:模板匹配=数据>
<数据>
<的xsl:属性名称=ctrlname>
<的xsl:value-of的选择=@名/>
< / XSL:属性>
<的xsl:属性名称=值>
< XSL:选择=值/&GT值的;
< / XSL:属性>
<的xsl:属性名称=评论>
<的xsl:value-of的选择=意见/>
< / XSL:属性>
< /数据>
< / XSL:模板>
< / XSL:样式>
XML输入
<?XML版本=1.0编码=UTF-8&GT?;
<根和GT;
<数据NAME =Test1.TextXML:空间=preserve>
<价值>请选择裸泵< /值>
<注释和GT;标签 - 泵配置和LT; /评论>
< /数据>
<数据NAME =Test2.TextXML:空间=preserve>
< VALUE>完成< /值>
<注释和GT; A07< /评论>
< /数据>
<数据NAME =Test3.TextXML:空间=preserve>
< VALUE>&确认LT; /值>
<注释和GT; A01< /评论>
< /数据>
< /根>
是的,我认为你也想排序属性后悔没有注意到。还需要注意的是,你已经改变了的语法的xsl:参数
,它不是以那种方式是正确的。您保留单引号双的人里面是非常重要的。这里是最终模板:
<?XML版本=1.0编码=UTF-8&GT?;
<的xsl:样式版本=1.0的xmlns:XSL =http://www.w3.org/1999/XSL/Transform
的xmlns:msxsl =瓮:架构 - 微软COM:XSLT排除-result- prefixes =msxsl> < XSL:PARAM NAME =sortby选择='价值'/>
< XSL:PARAM NAME =orderas选择='升'/> < XSL:输出方法=XML缩进=YES/> !< - <的xsl:模板匹配=@ * |节点()>
< XSL:复制>
< XSL:申请模板选择=@ * |节点()/>
< / XSL:复制>
< / XSL:模板> - >
<的xsl:模板匹配=根>
<根和GT;
< XSL:申请模板选择=数据>
< XSL:排序选择=* [名称()= $ sortby] | @ * [名称()= $ sortby]数据类型=文本命令={$ orderas}/>
< / XSL:申请模板>
< /根>
< / XSL:模板>
<的xsl:模板匹配=数据>
<数据>
<的xsl:属性名称=ctrlname>
<的xsl:value-of的选择=@名/>
< / XSL:属性>
<的xsl:属性名称=值>
< XSL:选择=值/&GT值的;
< / XSL:属性>
<的xsl:属性名称=评论>
<的xsl:value-of的选择=意见/>
< / XSL:属性>
< /数据>
< / XSL:模板>
< / XSL:样式>
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>
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:
<?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" select="'value'"/>
<xsl:param name="orderas" select="'ascending'"/>
<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]|@*[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属性为XSLT参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!