另一个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,定义动物类型)。
感谢。
答案 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>
备注强>:
为方便起见,包含允许动物的第二个文档包含在XSLT样式表中。在实践中,可以使用document(some-uri)
函数来读取,解析并将其定义为$vxmlFile
变量的内容。
如果允许的动物列表很长,那么使用Muenchian分组(键)会显着提高效率。