Замените значение href в тегах привязки HTML, используя XSLT - PullRequest
4 голосов
/ 29 сентября 2010

Я хочу заменить значение тегов href в HTML с помощью XSLT.Например: если тег привязки равен <a href="/dir/file1.htm" />, я хочу заменить значение href следующим образом: <a href="http://site/dir/file1.htm" />.Дело в том, что я хочу заменить все относительные URL-адреса абсолютными значениями.

Я хочу сделать это для всех тегов привязки в содержимом HTML.Как это сделать с помощью XSLT?

Спасибо.

РЕДАКТИРОВАТЬ: Это для Google Appliance.Я отображаю результаты в рамке, а ссылки на странице «Кэширование» не работают.Он принимает URL адресной строки в качестве корня.Здесь HTML находится в форме строки, и он отображает HTML на основе условия.Может кто-нибудь предложить способ заменить все теги href в строке?

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

Это преобразование XSLT 1.0 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pServerName" select="'http://MyServer'"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="a/@href[not(starts-with(.,'http://'))]">
  <xsl:attribute name="href">
   <xsl:value-of select="concat($pServerName, .)"/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

применительно к этому документу XML :

<html>
 <a href="/dir/file1.htm">Link 1</a>
 <a href="/dir/file2.htm">Link 2</a>
 <a href="/dir/file3.htm">Link 3</a>
</html>

создаетРазыскивается, правильный результат :

<html>
    <a href="http://MyServer/dir/file1.htm">Link 1</a>
    <a href="http://MyServer/dir/file2.htm">Link 2</a>
    <a href="http://MyServer/dir/file3.htm">Link 3</a>
</html>

II.Решение XSLT 2.0:

В XPath 2.0 можно использовать стандартную функцию resol-uri ()

Это преобразование:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">

 <xsl:variable name="vBaseUri" select="'http://Myserver/ttt/x.xsl'"/>

 <xsl:template match="/">
  <xsl:value-of select="resolve-uri('/mysite.aspx', $vBaseUri)"/>
 </xsl:template>
</xsl:stylesheet>

при применении к любому документу XML (не используется), дает требуемый, правильный результат :

http://Myserver/mysite.aspx

Еслимодуль таблицы стилей поступает с того же сервера, что и относительные URL-адреса, которые необходимо разрешить, поэтому нет необходимости передавать базовый URI в параметре - выполнение следующих действий приводит к желаемому результату:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">

 <xsl:variable name="vBaseUri">
  <xsl:for-each select="document('')">
   <xsl:sequence select="resolve-uri('')"/>
  </xsl:for-each>
 </xsl:variable>


 <xsl:template match="/">
  <xsl:value-of select="resolve-uri('/mysite.aspx', $vBaseUri)"/>
 </xsl:template>
</xsl:stylesheet>
0 голосов
/ 29 сентября 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="pDirectoryPath" select="'http://site.org/dir'"/>
    <xsl:variable name="vSitePath" select="concat(
                                            substring-before(
                                                   $pDirectoryPath,
                                                   '//'),
                                            '//',
                                            substring-before(
                                                 substring-after(
                                                       $pDirectoryPath,
                                                       '//'),
                                                 '/'))"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="a/@href[starts-with(.,'/')]" priority="1">
        <xsl:attribute name="href">
            <xsl:value-of select="concat($vSitePath,.)"/>
        </xsl:attribute>
    </xsl:template>
    <xsl:template match="a/@href[not(contains(.,'://'))]">
        <xsl:attribute name="href">
            <xsl:value-of select="concat($pDirectoryPath,'/',.)"/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<html>
    <body>
        <h4>Headline</h4>
        <p>Root relative link <a href="/image/image1.jpg" /></p>
        <p>Relative link <a href="next.htm" /></p>
        <p>Absolute Link <a href="http://site.org/dir/file1.htm" /></p>
    </body>
</html>

Выход:

<html>
    <body>
       <h4>Headline</h4>
       <p>Root relative link <a href="http://site.org/image/image1.jpg"></a></p>
       <p>Relative link <a href="http://site.org/dir/next.htm"></a></p>
       <p>Absolute Link <a href="http://site.org/dir/file1.htm"></a></p>
    </body>
</html>

Редактировать : Пример корневого относительного пути реального относительного пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...