感谢您的帮助!对此,我真的非常感激!我理解为什么我需要将值放在节点中,但是我不使用模板但是使用函数......我只是想不出如何将这些节点和模板放在函数中?
如果我只显示我的XSLT文件,可能会更容易。您可以在下面找到该文件,例如,这可能是它传递给函数的$ string(未转换的XML文件):
<img src="Afbeeldingen Hotpot/beer.jpg" alt="afbeelding van een beer" title="beer" width="170" height="144" style="display:block; margin-left:auto; margin-right:auto; text-align:center;" style="float:center;" />
这是XSLT文件的完整内容:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:foo="http://www.wathever.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs functx"
xmlns:functx="http://www.functx.com">
<xsl:import href="alle-functx-functies.xsl"/>
<xsl:function name="foo:functionIfImage">
<xsl:param name="string" as="xs:string"/>
<xsl:if test="contains($string,'.jpg')">
<xsl:sequence select="foo:functionImage($string,'.jpg')"/>
</xsl:if>
<xsl:if test="contains($string,'.png')">
<xsl:sequence select="foo:functionImage($string,'.png')"/>
</xsl:if>
<xsl:if test="contains($string,'.gif')">
<xsl:sequence select="foo:functionImage($string,'.png')"/>
</xsl:if>
<xsl:if test="not(contains($string,'.jpg')) and not(contains($string,'.png')) and not(contains($string,'.gif'))">
<xsl:sequence select="'iumi ondersteund alleen afbeeldingen van het formaat *.jpg, *.png of *.gif'"/>
</xsl:if>
<xsl:if test="not(contains($string,'img src='))">
<xsl:sequence select="'bevat geen img src='"/>
</xsl:if>
</xsl:function>
<xsl:function name="foo:functionImage">
<xsl:param name="string" as="xs:string"/>
<xsl:param name="type" as="xs:string"/>
<xsl:variable name="quot">"</xsl:variable>
<xsl:variable name="beforePath" as="xs:string">img src="</xsl:variable>
<xsl:variable name="globalPath" as="xs:string" select="substring-before(substring-after($string, $beforePath), $quot)" />
<xsl:variable name="beforeWidth" as="xs:string">width="</xsl:variable>
<xsl:variable name="width" as="xs:string" select="substring-before(substring-after($string, $beforeWidth), $quot)" />
<xsl:variable name="beforeHeight" as="xs:string">height="</xsl:variable>
<xsl:variable name="height" as="xs:string" select="substring-before(substring-after($string, $beforeHeight), $quot)" />
<xsl:if test="not(contains($globalPath,'http'))">
<xsl:variable name="fileName" as="xs:string"><xsl:sequence select="functx:substring-after-last($globalPath,'/')"/></xsl:variable>
<xsl:variable name="compatibleData" as="xs:string">
<xsl:sequence select="concat('<img source="images/',$fileName,'"',' width="',$width,'" height="',$height,'" />')"/>
</xsl:variable>
<xsl:value-of disable-output-escaping= "yes" select="$compatibleData" />
</xsl:if>
<xsl:if test="contains($globalPath,'http')">
<xsl:variable name="compatibleData" as="xs:string">
<xsl:sequence select="concat('<img source="',$globalPath,'"',' width="',$width,'" height="',$height,'" />')"/>
</xsl:variable>
<xsl:value-of disable-output-escaping= "yes" select="$compatibleData" />
</xsl:if>
</xsl:function>
</xsl:stylesheet>
所以这段我的XSLT代码给了我错误的输出:
<xsl:variable name="compatibleData" as="xs:string">
<xsl:sequence select="concat('<img source="',$globalPath,'"',' width="',$width,'" height="',$height,'" />')"/>
</xsl:variable>
<xsl:value-of disable-output-escaping= "yes" select="$compatibleData" />
转型后的输出:
<img source="images/beer.jpg" width="300" height="300" />
转换后我想要的输出:
<img source="images/beer.jpg" width="300" height="300" />
如何让输出说<
而不是<
,>
而不是>
?
value-of disable-output-escaping =“yes”不起作用......
答案 0 :(得分:6)
我的XSLT代码:
<xsl:variable name="compatibleData" as="xs:string"><xsl:sequence select="concat('<img source="images/',$fileName,'"',' width="',$width,'" height="',$height,'" />')"/></xsl:variable>
<xsl:sequence select="$compatibleData"/>
永远不要通过逃避标记来破坏标记 !!!
每当使用XSLT生成XML文档时,它都会输出元素(和其他类型的),节点 - 而不是字符串。
使用强>:
<img source="images/{$filename}" width="{$width}" height="{$height}" />
解释:使用AVT( Attribute-Value-Templates )可使代码更短,更易读。当事先知道元素和属性名称时,始终使用AVT。
答案 1 :(得分:4)
您正在尝试输出实际的结构化(非转义)XML,因此您需要
答案 2 :(得分:3)
您实际上只需将<br/>
键入XSLT,它就会传递到结果中。
<MyElement>
<xsl:value-of select="/My/Element/Value"/>
<br/>
</MyElement>
答案 3 :(得分:1)
为什么要尝试使用xs:string
标记定义创建变量?使用element定义变量很容易并使用它:
<xsl:variable name="compatibleData">
<img source="images/{$filename}" width="{$width}" height="{$height}"/>
</xsl:variable>
<xsl:template match="something">
<xsl:copy-of select="$compatibleData"/>
</xsl:template>
答案 4 :(得分:0)
这是另一种选择,对于你不能使用w / disable-output-escaping的值(即与copy-of一起使用)的情况:
<xsl:stylesheet...>
<xsl:output use-character-maps="special-chars"/>
<xsl:character-map name="special-chars">
<xsl:output-character character=">" string=">"/>
</xsl:character-map>
答案 5 :(得分:-1)
我想你可能在寻找:
<xsl:value-of disable-output-escaping= "yes" select="$compatibleData" />