XSL:if语句未标识xml数据中的必需项

时间:2015-06-01 00:33:24

标签: xml xslt

我是XSL的新手,所以请原谅我的无知。我正在尝试构建一个只从资源池中提取某些元素的表 - 标记为“TeamMember”的那些元素。我认为我的xsl:if语法或者我引用XML数据的方式都有问题。

XSL代码是 -

<xsl:for-each select="miradi:Resource/miradi:ResourceRoleCodesContainer/..">
<xsl:if test="miradi:Resource/miradi:ResourceRoleCodesContainer/miradi:code = TeamMember">
<xsl:value-of select="miradi:ResourceSurname"/>

XML数据是 -

<miradi:ResourcePool><miradi:Resource Id="2530">
<miradi:ResourceResourceType>Person</miradi:ResourceResourceType>
<miradi:ResourceIdentifier>DA</miradi:ResourceIdentifier>
<miradi:ResourceSurname>Andrews</miradi:ResourceSurname>
<miradi:ResourcePosition>Manager</miradi:ResourcePosition>
<miradi:ResourceRoleCodesContainer><miradi:code>TeamMember</miradi:code </miradi:ResourceRoleCodesContainer>
</miradi:Resource>

当我删除xsl:if语句时,代码正确地构建了一个表,显示了每个资源的行;但我只想为每个标有“TeamMember”的资源显示一行。当我包含XSL:if语句时,我没有在表中获得任何行。

非常感谢任何帮助。 感谢

1 个答案:

答案 0 :(得分:1)

您的代码存在以下问题:

首先,做完:

<xsl:for-each select="miradi:Resource/miradi:ResourceRoleCodesContainer/..">

你(可能)在miradi:Resource的背景下。我说&#34;可能&#34;,因为你没有告诉我们起始情境。下到miradi:ResourceRoleCodesContainer,然后回到父miradi:Resource,这也没什么意义,但那是另一个问题。

在此上下文中,您在xsl:if测试中使用的表达式:

miradi:Resource/miradi:ResourceRoleCodesContainer/miradi:code

不选择任何内容,因为miradi:Resource不是上下文节点的子节点。

另一个问题是您的条件是针对不存在的节点而不是文字字符串进行测试的。你的测试应该是:

<xsl:if test="miradi:ResourceRoleCodesContainer/miradi:code = 'TeamMember'">

或者你可以这样做:

<xsl:for-each select="miradi:Resource[miradi:ResourceRoleCodesContainer/miradi:code = 'TeamMember']">
    <xsl:value-of select="miradi:ResourceSurname"/>
</xsl:for-each>