2012-06-14 30 views
3

我试图创建一个XSL模板,将接受通配符作为模板匹配,如以下示例的一部分将显示:使用通配符的<xsl:匹配=“myTag *”>

<xsl:template match="*_Nokia_5.0"> 
    <xsl:value-of select="."/> 
    <xsl:text>,</xsl:text> 
    <xsl:if test="position()=last()"> 
    <xsl:text>&#10;</xsl:text> 
    </xsl:if> 

我想要实现的是'匹配任何具有'Nokia_5.0'作为字符串一部分的标签。 有什么办法可以在xslt 1.0中做到这一点?

感谢

回答

2

使用contains(name(), "Nokia_5.0")是解决不了问题,因为它会像上返回名称误报:

myNokia_5.0isAwsome 

但是要求是名称必须年底以字符串'Nokia_5.0'


正确的溶液

在XSLT 2.0

<xsl:template match="*[ends-with(name(), 'Nokia_5.0')]"> 

在XSLT 1.0

<xsl:template match= 
"*[substring(name(), string-length(name()) -8) = 'Nokia_5.0')]"> 
+0

谢谢你Dimitre工作。 :) – yorkshireflatcap

+0

@yorkshireflatcap:不客气。 –

1

假设你的意思节点名称必须包含给定的字符串,可以使用包含()

<xsl:template match='*[contains(name(), "Nokia_5.0")]'> 

然而,这将意味着,任何节点不符合这一要求缺乏一个模板,并且如果您将模板应用于所有节点,将按原样输出。

相反,您可以使过滤器不在模板定义中,而是在应用模板时进行规定。

<xsl:apply-templates select='node[contains(name(), "Nokia_5.0")]' /> 
.... 
<xsl:template match='node'> 
    <xsl:value-of select='.' /> 
</xsl:template> 
+0

吴丹似乎不工作 - 它根本无法识别节点。我已经插入了你的第二个例子,因为它与我想要做的事很接近。 – yorkshireflatcap

+0

解决它:[包含(**名称()**,“诺基亚_5.0”)] – yorkshireflatcap

+0

哦,所以你的意思是节点的名称...我会更新我的答案仍然 – Utkanos