XSLT получить часть строки или URL - PullRequest
3 голосов
/ 17 октября 2011

Я возвращаю следующий 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"

Теперь я хочу объединить GROUPID URL-адреса со значением из атрибута FriendlyHref. Можно ли получить это значение с помощью XSLT1.0?

Результат, который я хотел бы получить:

/nl-nl/assortiment/group/category/text.aspx?Group=GROUP11

Я уже нашел эту и эту тему здесь на stackoverflow, но эти примеры не дали мне никаких результатов.

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Это преобразование корректно получает значение строки запроса независимо от его местоположения (в начале, в середине или в конце строки, содержащей все строки запроса):

<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
2 голосов
/ 17 октября 2011

Если 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>
...