XSLT将绝对链接的相对链接替换为变量中可用的数据

时间:2016-06-15 14:20:47

标签: xslt

我正在尝试用绝对链接替换相对链接,其中数据在param中可用。

这是我正在使用的xsl。

Class

这是我需要的输出。

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:ext="http://exslt.org/common"
        exclude-result-prefixes="#all">

    <xsl:output method="html" encoding="UTF-8" omit-xml-declaration="yes" indent="no"/>

    <xsl:param name="text1">
     <span>Response from web service starts.<div>
        <a href="http://www.google.com">Absolute Link</a>
        Other stuff<a href="/link1">Relative Link</a></div>
        Response from web service done.</span>
    </xsl:param>

    <xsl:template match="/">
       <html>
       <body>       
           <a href="http://www.gmail.com">Link in HTML</a>                  
        <xsl:copy>
            <xsl:apply-templates select="ext:node-set($text1)//a[@href[starts-with(.,'/')]]"/>
        </xsl:copy>
       </body>
       </html>
     </xsl:template>

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

此xsl无效。输入xml可以是任何东西。我想知道参数text1中的相对链接如何用绝对链接替换,然后呈现为html。

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

您需要处理所有节点,并且需要输入身份转换模板来复制您不想转换的节点。此外,为href属性设置模板:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:ext="http://exslt.org/common"
    exclude-result-prefixes="xs ext">

    <xsl:output method="html" encoding="UTF-8" omit-xml-declaration="yes" indent="no"/>

    <xsl:param name="text1">
        <span>Response from web service starts.<div>
            <a href="http://www.google.com">Absolute Link</a>
            Other stuff<a href="/link1">Relative Link</a></div>
            Response from web service done.</span>
    </xsl:param>

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

    <xsl:template match="/">
        <html>
            <body>       
                <a href="http://www.gmail.com">Link in HTML</a>                  
                <xsl:copy>
                    <xsl:apply-templates select="ext:node-set($text1)/node()"/>
                </xsl:copy>
            </body>
        </html>
    </xsl:template>

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

请注意,您的样式表有version="2.0"但使用了node-set扩展函数,因此我假设您要使用XSLT 1.0处理器解决这个问题,您需要使用node-set函数。如果您确实使用过XSLT 2.0处理器,则可以将<xsl:apply-templates select="ext:node-set($text1/node()"/>简化为<xsl:apply-templates select="$text1/node()"/>

答案 1 :(得分:0)

而不是

<xsl:apply-templates select="ext:node-set($text1)//a[@href[starts-with(.,'/')]]"/>

您需要递归副本并仅修改匹配的节点

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

<xsl:template match="a[@href[starts-with(.,'/')]]">模板的匹配更改为

 <xsl:template match="@href[starts-with(.,'/')]">

然后