【问题标题】:XSLT get part of string or urlXSLT 获取字符串或 url 的一部分
【发布时间】:2011-10-17 12:22:03
【问题描述】:

我将以下 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 上找到了 thisthis 主题,但是这些示例根本没有给我任何结果。

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案1】:

    如果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>
    

    【讨论】:

    • 太棒了!正是我需要的。在这种情况下很好的解决方案,因为 GroupID 确实总是最后一个参数。
    • 如果 XML 是这样的:&lt;Provider&gt;&lt;a title="" href="/pro.aspx?id=0098"&gt;And, Jo&lt;/a&gt;&lt;/Provider&gt;stackoverflow.com/questions/29307212/…
    • @Search, match="Provider/a"?
    • 我已经添加了一个详细的问题,如果你不介意看看吗?谢谢。
    【解决方案2】:

    此转换正确获取查询字符串值,无论其位置如何(在包含所有查询字符串的字符串的开头、中间或结尾):

    <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('&amp;',substring-after(@Href, '?'), '&amp;')"/>
    
        <xsl:variable name="vWantedValue"   select=
         "substring-before
             (substring-after($vQueryStrings, '&amp;GroupID='),
             '&amp;')"/>
        <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&amp;GroupID=GROUP11&amp;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('&amp;',
                            substring-after(@*[name()=$pHrefName], '?'),
                            '&amp;')"/>
    
        <xsl:variable name="vWantedValue"   select=
         "substring-before
             (substring-after($vQueryStrings, concat('&amp;', $pQSName, '=')),
             '&amp;')"/>
        <xsl:value-of select="$vWantedValue"/>
     </xsl:template>
    </xsl:stylesheet>
    

    当对上面的 XML 文档应用这种转换时,就会产生想要的结果

    GROUP11
    

    【讨论】:

      猜你喜欢
      • 2017-07-27
      • 2015-08-20
      • 1970-01-01
      • 2023-03-16
      • 2016-06-13
      • 1970-01-01
      相关资源
      最近更新 更多