我正在尝试用绝对链接替换相对链接,其中数据在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。
非常感谢任何帮助。感谢。
答案 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(.,'/')]">
然后