我在xml中有这样的场景:
<ViewFields>
<FieldRef Name="Planing Status" />
<FieldRef Name="Resource Status" />
<FieldRef Name="Development Status" />
<FieldRef Name="Testing Status" />
</ViewStatus>
我必须在xsl中循环使用,我在下面跟着:
<xsl:template name="FieldRef_body.Status" match="FieldRef[@Name=/ViewFields/FieldRef[1]]" mode="body">
它不会归还任何东西 @Name变量我在本节中使用了几个地方。我想通过循环将FieldRef值赋给@Name变量。
答案 0 :(得分:2)
<xsl:template name="FieldRef_body.Status"
match="FieldRef[@Name=/ViewFields/FieldRef[1]]" mode="body">
这里有两点需要注意:
match属性包含一个XPath表达式,当应用于提供的XML文档时,会选择 no 节点。它应该选择名为FieldRef
的元素,其Name
属性的字符串值等于FieldRef
top元素的第一个ViewFields
子元素的字符串值。但是,XML文档中的FieldRef
个元素都没有任何(非空)字符串值。另一方面,所有Name
属性的字符串值都是非空的。我的猜测是你想要:match="FieldRef[@Name=/ViewFields/FieldRef[1]/@Name]"
如果模式与当前模式不同,XSLT处理器不会将(非匿名)模式中的任何模板视为选择
由于XSLT 1.0(以及XSLT 2.0)中的初始模式是空(匿名)模式,因此考虑选择非匿名模式的模板的唯一方法是在{{{ 1}}指令。
此转化:
<xsl:apply-templates>
生成此结果,表明已选择模板进行处理:
<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:template match="/">
<xsl:apply-templates select="*/*" mode="body"/>
</xsl:template>
<xsl:template match="FieldRef[@Name=/ViewFields/FieldRef[1]/@Name]"
mode="body">
<xsl:value-of select="@Name"/>
</xsl:template>
</xsl:stylesheet>