2

如何使用xslt查找具有属性值的节点是否存在?

假设如果我的 xml 像这样

<root>
 <sub>
    <p>text</p>
   <title id='id1-num-444'>text</title>
    <p>text</p>  
   <title id='id1-str-aaa'>text</title>
    <p>text</p>  
   <title id='id1-num-333'>text</title> 
    <p>text</p>  
 </sub>
</root>

我使用了以下 xsl

<xsl:template match ="sub">

  ....some tags...

  <xsl:if test ="contains(name(), 'title[@id='id1-num']')">
  <xsl:call-template name ="title"></xsl:call-template>
</xsl:if>
</xsl:template>

if条件需要检查直到num,它不应该考虑num之后的任何东西。谢谢。

4

3 回答 3

2

更短更精确的解决方案是使用标准 XPath 函数starts-with()

starts-with(@id, 'id1-num')

因此,您的代码片段变为:

<xsl:if test="starts-with(@id, 'id1-num')">
   <xsl:call-template name ="title"/>
</xsl:if>
于 2012-07-06T12:53:38.303 回答
1

如果你想测试一个属性值的一部分,你需要使用contains(),但当然不是你做的那样。

假设,正如 Sean Durkin 所说,您的重点是候选标题元素,

<xsl:if test ="contains(self::title/@id,'id1-num')">
    <xsl:call-template name ="title"></xsl:call-template>
</xsl:if>

或者稍微不那么明确的

<xsl:if test ="contains(@id,'id1-num')">
    <xsl:call-template name ="title"></xsl:call-template>
</xsl:if>

会成功的。

于 2012-07-06T11:44:15.463 回答
0

我们需要更多的上下文来理解你想要什么,但也许你想匹配这样的模板规则?...

<xsl:template match="title[@id='id1-num']">
  ... contents go here ...
</xsl:template>

如果它需要在序列构造函数中进行测试,并且焦点项是候选标题元素,那么可能吗?...

<xsl:if test ="self::title[@id='id1-num']">
  <xsl:call-template name ="title"></xsl:call-template>
</xsl:if>

在上述情况下,当且仅当以下情况下,测试才会通过:

  1. 焦点项目是一个名为title的元素;
  2. 它有一个属性 id 值为“id1-num”
于 2012-07-06T09:41:45.860 回答