使用xslt的查询字符串
是否可以使用xslt访问查询字符串 我有一个网址 www.example.com/page.aspx?k=aa&lang=en 我想做一些像 如果lang=en使用xslt的查询字符串,xslt,url,Xslt,Url,是否可以使用xslt访问查询字符串 我有一个网址 www.example.com/page.aspx?k=aa&lang=en 我想做一些像 如果lang=en <div>displaly stuff</div> 显示内容 否则 显示其他内容 您能告诉我如何使用xslt实现这一点吗?不在本机xslt中不可以,但您可以编写扩展对象来处理本机xslt范围之外的复杂函数,例如,在xslt中,您可以在样式表中插入名称空间,例如 xmlns:ex="my:Qs" 然后打电话
<div>displaly stuff</div>
显示内容
否则
显示其他内容
您能告诉我如何使用xslt实现这一点吗?不在本机xslt中不可以,但您可以编写扩展对象来处理本机xslt范围之外的复杂函数,例如,在xslt中,您可以在样式表中插入名称空间,例如
xmlns:ex="my:Qs"
然后打电话
<xsl:variable name="qs" select="my:Qs('parameterName')"/>
否,因为XSLT不是独立运行的编译代码。它是一种转换XML数据的技术,由某些XSLT处理器调用 因此,由您向XSLT处理器提供必要的变量数据作为参数 可以访问查询吗 使用xslt的字符串 是,如果查询字符串作为参数传递 下面的代码显示访问查询字符串不需要扩展函数。它可以作为(全局)参数传递。这是首选,因为它减少了对扩展的需求,并产生了更干净、更可读的代码 然后可以执行标记化(使用XSLT 2.0中的函数或XSLT 1.0中使用的模板或自行编写的递归标记化模板) XSLT 1.0解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
>
<xsl:import href="strSplit-to-Words.xsl"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="pQString" select=
"'?login=userId&tag=XSLT&lang=en&level=expert'"
/>
<xsl:template match="/">
<xsl:variable name="vwordNodes">
<xsl:call-template name="str-split-to-words">
<xsl:with-param name="pStr" select="$pQString"/>
<xsl:with-param name="pDelimiters"
select="'?&'"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="vLang" select=
"substring-after(ext:node-set($vwordNodes)/*
[starts-with(.,'lang=')]
[last()],
'lang='
)
"/>
<xsl:value-of select="concat('lang = ', $vLang)"/>
</xsl:template>
</xsl:stylesheet>
lang = en
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="pQString" as="xs:string" select=
"'?login=userId&tag=XSLT&lang=en&level=expert'"
/>
<xsl:template match="/">
<xsl:variable name="vLang" as="xs:string" select=
"substring-after(
tokenize($pQString, '\?|&')
[starts-with(.,'lang=')]
[last()],
'lang='
)
"/>
lang = "<xsl:sequence select='$vLang'/>"
</xsl:template>
</xsl:stylesheet>
lang = "en"
请注意使用FXSL 1.xstr拆分为单词
模板以及使用EXSLText:node-set()
扩展功能
XSLT 2.0解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
>
<xsl:import href="strSplit-to-Words.xsl"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="pQString" select=
"'?login=userId&tag=XSLT&lang=en&level=expert'"
/>
<xsl:template match="/">
<xsl:variable name="vwordNodes">
<xsl:call-template name="str-split-to-words">
<xsl:with-param name="pStr" select="$pQString"/>
<xsl:with-param name="pDelimiters"
select="'?&'"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="vLang" select=
"substring-after(ext:node-set($vwordNodes)/*
[starts-with(.,'lang=')]
[last()],
'lang='
)
"/>
<xsl:value-of select="concat('lang = ', $vLang)"/>
</xsl:template>
</xsl:stylesheet>
lang = en
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="pQString" as="xs:string" select=
"'?login=userId&tag=XSLT&lang=en&level=expert'"
/>
<xsl:template match="/">
<xsl:variable name="vLang" as="xs:string" select=
"substring-after(
tokenize($pQString, '\?|&')
[starts-with(.,'lang=')]
[last()],
'lang='
)
"/>
lang = "<xsl:sequence select='$vLang'/>"
</xsl:template>
</xsl:stylesheet>
lang = "en"
实际上,“XSLT不是编译代码”这句话并不总是正确的。还有XSLT处理器,例如.NET XslCompiledTransform类,它在执行转换之前生成已编译的CLR字节码。Saxon还有一个生成编译(JVM)字节码的选项,这和OP的问题没有什么关系,XSLT转换是否“自行运行”与是否以及如何访问查询字符串的问题无关。@Dimitre:我不同意。我认为这是关键点。你的答案也是这样说的。值必须作为参数传递。XSL文件本身无法从web请求加载查询字符串。是的,但将值作为参数传递在编译样式中都会发生ets和已解释的。无论代码是否编译。当前接受的答案不正确。访问查询字符串不需要扩展函数。它可以作为(全局)参数传递。这是首选,因为它减少了对扩展的需要,并导致更干净、更可读的代码。