XSLT:为什么只使用 XPath 计算第一个路径?



我想(在if中)查看带有字符串的XPath是否存在。使用"/Dataobjekt/persons/person/role",仅评估第一个路径。其他尝试,如"/Dataobjekt/persons//person/role"或"/Dataobjekt/persons//.//role"也不起作用。如何确定"人员"下是否存在角色?

(唯一有效的是直接查询"/Dataobjekt/persons/person[3]/role")

.XML:

<?xml version="1.0" encoding="UTF-16"?>
<Dataobjekt>
<persons>
<person>
<UUID>1</UUID>
<role>Manager</role>
</person>
<person>
<UUID>2</UUID>
<role>Employee</role>
</person>
<person>
<UUID>3</UUID>
<role>CEO</role>
</person>
</persons>
<info>
<persons>
<person>
<salary>2000</salary>
<role>Manager</role>
</person>
<person>
<salary>1000</salary>
<role>Employee B</role>
</person>
<person>
<salary>3000</salary>
<role>CEO</role>
</person>
</persons>
</info>
</Dataobjekt>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soko="http://soko.net/V3.0/sokoSchema">
<xsl:template match="/">
<soko:result xmlns:soko="http://soko.net/V3.0/sokoSchema">
<soko:foo>
<xsl:choose>
<xsl:when test="contains(/Dataobjekt/persons/person/role, 'Manager')">
OOOOOOOOKKKKKK
</xsl:when>
<xsl:otherwise>WWWRRROOOONNNNGGG</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="contains(/Dataobjekt/persons/person/role, 'CEO')">
OOOOOOOOKKKKKK
</xsl:when>
<xsl:otherwise>WWWRRROOOONNNNGGG</xsl:otherwise>
</xsl:choose>
</soko:foo>
</soko:result>
</xsl:template>
</xsl:stylesheet>

结果:

<?xml version="1.0" encoding="UTF-8"?>
<soko:result xmlns:soko="http://soko.net/V3.0/sokoSchema">
<soko:foo>
OOOOOOOOKKKKKK
WWWRRROOOONNNNGGG</soko:foo>
</soko:result>

contains()函数的第一个参数必须是字符串。改为提供节点集时,通过返回所提供节点集中第一个节点的字符串值,将其转换为字符串。这是在 XSLT 1.0 中;在 XSLT 2.0+ 中,您将收到一个错误。

要测试是否至少有一个personrole包含字符串"CEO",请尝试:

<xsl:when test="/Dataobjekt/persons/person[contains(role, 'CEO')]">

请注意,这假设一个person最多有一个role。否则,您将需要执行以下操作:

<xsl:when test="/Dataobjekt/persons/person/role[contains(., 'CEO')]">

最新更新