我将在XML文件中获得以下XML元素。我需要从这个元素中检索URL信息。
<Page SmallImage="" LargeImage="" Icon="" MenuText="Text" MouseOver="" Image=""
ImageActive="" ImageMouseOver="" Allowclick="True" ShowInSitemap="True"
Href="Default.aspx?ID=27&GroupID=GROUP11"
FriendlyHref="/nl-nl/assortiment/group/category/text.aspx" Title="" NavigationTag=""
RelativeLevel="4" Sort="1" LastInLevel="True" ChildCount="0" class="L4" ID="18"
AreaID="1" InPath="False" Active="False" AbsoluteLevel="4"/>
在上面的例子中可以看到属性'Href'包含一个GroupID。
Href="Default.aspx?ID=27&GroupID=GROUP11"
现在我想将URL的GROUPID与FriendlyHref属性的值连接起来。是否有可能使用XSLT1.0获得这个值?
我想得到的结果是;
/nl-nl/assortiment/group/category/text.aspx?Group=GROUP11
我已经在stackoverflow上找到了这个和这个主题,但是这些例子根本没有给我任何结果。
如果GroupID
始终是查询字符串的最后一个参数,则可以使用substring-after()提取值。例如:
<xsl:template match="Page">
<a>
<xsl:attribute name="href">
<xsl:value-of select="concat(@FriendlyHref, '?Group=', substring-after(@Href, 'GroupID='))" />
</xsl:attribute>
</a>
</xsl:template>
此转换正确地获取查询字符串值,而不管其位置(在包含所有查询字符串的字符串的开头、中间或结尾):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:variable name="vQueryStrings"
select="concat('&',substring-after(@Href, '?'), '&')"/>
<xsl:variable name="vWantedValue" select=
"substring-before
(substring-after($vQueryStrings, '&GroupID='),
'&')"/>
<xsl:value-of select="concat(@FriendlyHref, '?',$vWantedValue)"/>
</xsl:template>
</xsl:stylesheet>
当应用于所提供的XML文档时(稍作修改以使其更具挑战性,并且格式良好):
<Page SmallImage="" LargeImage="" Icon=""
MenuText="Text" MouseOver="" Image=""
ImageActive="" ImageMouseOver="" Allowclick="True"
ShowInSitemap="True"
Href="Default.aspx?ID=27&GroupID=GROUP11&foo=bar"
FriendlyHref="/nl-nl/assortiment/group/category/text.aspx"
Title="" NavigationTag="" RelativeLevel="4" Sort="1"
LastInLevel="True" ChildCount="0" class="L4" ID="18"
AreaID="1" InPath="False" Active="False" AbsoluteLevel="4"/>
生成所需的正确结果:
/nl-nl/assortiment/group/category/text.aspx?GROUP11
最后:一个完全泛型/参数化的解决方案,它接受任何查询字符串名称作为参数并产生其值:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:call-template name="getQueryString"/>
</xsl:template>
<xsl:template name="getQueryString">
<xsl:param name="pHrefName" select="'Href'"/>
<xsl:param name="pQSName" select="'GroupID'"/>
<xsl:variable name="vQueryStrings"
select="concat('&',
substring-after(@*[name()=$pHrefName], '?'),
'&')"/>
<xsl:variable name="vWantedValue" select=
"substring-before
(substring-after($vQueryStrings, concat('&', $pQSName, '=')),
'&')"/>
<xsl:value-of select="$vWantedValue"/>
</xsl:template>
</xsl:stylesheet>
当对上面的XML文档应用此转换时,将产生所需的结果:
GROUP11