Ale*_*lex 11 xml xslt xpath count
我有以下XML文件存储电影和演员的详细信息:
<database
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="movies.xsd">
<movies>
<movie movieID="1">
<title>Movie 1</title>
<actors>
<actor actorID="1">
<name>Bob</name>
<age>32</age>
<height>182 cm</height>
</actor>
<actor actorID="2">
<name>Mike</name>
</actor>
</actors>
</movie>
</movies>
</database>
Run Code Online (Sandbox Code Playgroud)
如果actor元素包含多个子元素(在这种情况下是它的名称,年龄和高度),那么我想将其名称显示为超链接.
但是,如果actor元素只包含一个子元素(名称),则它应显示为纯文本.
XSLT:
<xsl:template match="/">
<div>
<xsl:apply-templates select="database/movies/movie"/>
</div>
</xsl:template>
<xsl:template match="movie">
<xsl:value-of select="concat('Title: ', title)"/>
<br />
<xsl:text>Actors: </xsl:text>
<xsl:apply-templates select="actors/actor" />
<br />
</xsl:template>
<xsl:template match="actor">
<xsl:choose>
<xsl:when test="actor[count(*) > 1]/name">
<a href="actor_details.php?actorID={@actorID}">
<xsl:value-of select="name"/>
</a>
<br/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="name"/>
<br/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,Bob应显示为超链接,并且Mike应显示为纯文本.但是,我的页面将Bob和Mike显示为纯文本.
Tim*_*m C 20
你的第一个xsl:这里的测试不正确
<xsl:when test="actor[count(*) > 1]/name">
Run Code Online (Sandbox Code Playgroud)
你已经在这里定位了一个actor元素,所以这将寻找一个actor元素,它是当前actor元素的子元素,并且什么也没找到.
你可能只是想这样做
<xsl:when test="count(*) > 1">
Run Code Online (Sandbox Code Playgroud)
或者,你可以这样做
<xsl:when test="*[2]">
Run Code Online (Sandbox Code Playgroud)
即,第二个位置是否有一个元素(当你只想检查多个元素时,它会节省所有元素的计数),
或者你想检查当前的actor元素是否有一个名称以外的元素?
<xsl:when test="*[not(self::name)]">
Run Code Online (Sandbox Code Playgroud)
另外,将测试放在模板匹配中可能会更好,而不是使用xsl:choose.
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/>
<xsl:template match="/">
<div>
<xsl:apply-templates select="database/movies/movie"/>
</div>
</xsl:template>
<xsl:template match="movie">
<xsl:value-of select="concat('Title: ', title)"/>
<br/>
<xsl:text>Actors: </xsl:text>
<xsl:apply-templates select="actors/actor"/>
<br/>
</xsl:template>
<xsl:template match="actor">
<xsl:value-of select="name"/>
<br/>
</xsl:template>
<xsl:template match="actor[*[2]]">
<a href="actor_details.php?actorID={@actorID}">
<xsl:value-of select="name"/>
</a>
<br/>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
请注意,在此实例中,XSLT处理器应首先匹配更具体的模板.
| 归档时间: |
|
| 查看次数: |
55744 次 |
| 最近记录: |