什么是谓词谓词中的current()

时间:2010-07-29 11:02:02

标签: xslt xpath

另一个XPath / XSL问题:)

如果我有一个节点树,如:

  

A

     

- B(anymal-types = pets)

     

---- C(type = bird)

     

---- C(type = cat)

     

---- C(type = dog)

     

- B(工作动物)

     

---- C(type = cow)

     

---- C(type = elephant)

     

-A
  ...

和另一个xml文件($ xmlFile),列出了给定的任何类型所需的类型

  

-PET

     

---- cat

     

----狗

     

- 工作动物

     

----大象

我如何只选择$ xmlFile给我的这些动物?:

 

在这种情况下,current()指的是:   - 是模板匹配的节点(“A”)   - 或者是否正在评估当前的C节点。

什么是正确评估当前C节点和步骤一节点的正确方法(B,定义动物类型)。

感谢。

1 个答案:

答案 0 :(得分:0)

此转化

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="vrtfXmlFile">
     <pets>
       <animal>cat</animal>
       <animal>dog</animal>
     </pets>
     <working-animals>
       <animal>elephant</animal>
     </working-animals>
    </xsl:variable>

    <xsl:variable name="vxmlFile" select=
     "document('')/*/xsl:variable
                      [@name='vrtfXmlFile']"/>

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

 <xsl:template match="b">
   <xsl:if test="$vxmlFile/*[name()=current()/@animal-types]">
     <xsl:call-template name="identity"/>
   </xsl:if>
 </xsl:template>

 <xsl:template match="c">
  <xsl:if test=
    "$vxmlFile/*[name()=current()/../@animal-types]
                              /animal[.=current()/@type]">
   <xsl:call-template name="identity"/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档时

<a>
 <b animal-types="pets">
   <c type="bird"/>
   <c type="cat"/>
   <c type="dog"/>
 </b>
 <b animal-types="working-animals">
   <c type="cow"/>
   <c type="elephant"/>
 </b>
</a>

生成想要的正确结果

<a>
   <b animal-types="pets">
      <c type="cat"/>
      <c type="dog"/>
   </b>
   <b animal-types="working-animals">
      <c type="elephant"/>
   </b>
</a>

备注

  1. 为方便起见,包含允许动物的第二个文档包含在XSLT样式表中。在实践中,可以使用document(some-uri)函数来读取,解析并将其定义为$vxmlFile变量的内容。

  2. 如果允许的动物列表很长,那么使用Muenchian分组(键)会显着提高效率。