我有一个存储电影及其演员的 XML 文件。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="index.xsl"?>
<movies
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="movies.xsd">
<movie movieID="1">
<actors>
<actor actorID="1">
<name link="bob.website.com">Bob</name>
<age>29</age>
<height>1.75 m</height>
<from>USA</from>
</actor>
<actor actorID="2">
<name link="jack.website.com">Jack</name>
<age>24</age>
<height>1.83 m</height>
<from>UK</from>
</actor>
<actor actorID="3">
<name>James</name>
</actor>
<actor actorID="4">
<name>Tom</name>
</actor>
<actor actorID="5">
<name>Mark</name>
</actor>
</actors>
</movie>
</movies>
从上面的代码可以看出,我有 5 个演员位于“电影”元素内。前 2 个演员包含 4 个子元素(姓名、年龄、身高和来自)以及“name”元素内的属性“link”,该属性提供指向特定演员页面的超链接。其他 3 个参与者仅包含元素“名称”。
我希望我的页面在列表中显示 5 个演员的姓名,前 2 个姓名显示为超链接(指向特定演员页面的链接),另外 3 个显示为常规文本。
我想区分超链接名称和常规名称的方法是通过 XPath。我希望所有包含超过 1 个子元素(在本例中为名称、年龄、身高和来自)的“演员”元素都显示为超链接。包含不超过 1 个子元素的所有其他“演员”元素将显示为常规文本
这是我的 XSLT 文件,其中包含我编写的 Xpath 查询。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes" media-type="text/html"/>
<xsl:template match="movie">
<xsl:text>Actors: </xsl:text>
<xsl:apply-templates select="actors/actor"/>
</xsl:template>
<xsl:template match="actor">
<xsl:if test="//actor/*[position()>1]/../name">
<a href="{@link}">
<xsl:value-of select="name"/>
</a>
</xsl:if>
<xsl:element name="br"/>
</xsl:template>
</xsl:stylesheet>
我设法编写了查询//actor/*[position()>1]/../name
,并且只显示了前 2 个演员的姓名(在 Xpath notepad++ 插件中测试)。我只是不知道如何将它们与“链接”属性正确连接并将它们显示在页面上。
这是我想要达到的最终结果:
前 2 个演员的名字是超链接的,因为“演员”元素包含多于 1 个子元素。其他 3 个“actor”元素仅包含 1 个子元素,因此它们对应的“名称”显示为纯文本。