我如何通过一个XML属性为XSLT参数? [英] How do I pass a xml attribute to xslt parameter?

查看:118
本文介绍了我如何通过一个XML属性为XSLT参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我除了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 =htt​​p://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 =htt​​p://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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆