使用XPath和XSLT超链接XML子元素
我有一个存储电影及其演员的XML文件使用XPath和XSLT超链接XML子元素,xml,xslt,xpath,hyperlink,Xml,Xslt,Xpath,Hyperlink,我有一个存储电影及其演员的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 movie
<?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>
我已经成功地编写了查询//actor/*[position()>1]/../name
,并且只显示了前两个actor的名称(在Xpath notepad++插件中测试)。
我只是不知道如何正确地将它们与“link”属性连接起来,并在页面上显示它们
这是我想要实现的最终结果:
前两个actor的名称是超链接的,因为“actor”元素包含多个子元素。
其他3个“actor”元素只包含1个子元素,因此它们对应的“name”显示为纯文本。当然更简单的方法是直接将模板应用于
name
元素,并区分那些具有链接
属性的和那些不使用单独模板的:
<xsl:template match="movie">
<xsl:text>Actors: </xsl:text>
<xsl:apply-templates select="actors/actor/name"/>
</xsl:template>
<xsl:template match="name[@link]">
<a href="{@link}"><xsl:value-of select="." /></a><br/>
</xsl:template>
<xsl:template match="name">
<xsl:value-of select="."/><br/>
</xsl:template>
演员:
伊恩,这确实是一种更简单的方法。非常感谢你的帮助@Alex如果您确实想根据子元素的数量进行区分,那么您可以通过制作第一个模板match=“actor[count(*)1]/name”
,但是[@link]
版本更好地捕捉实际语义。根据“link”属性区分子元素更有意义,这就不那么复杂了。但也谢谢你给我第二个解决方案。
<xsl:template match="movie">
<xsl:text>Actors: </xsl:text>
<xsl:apply-templates select="actors/actor/name"/>
</xsl:template>
<xsl:template match="name[@link]">
<a href="{@link}"><xsl:value-of select="." /></a><br/>
</xsl:template>
<xsl:template match="name">
<xsl:value-of select="."/><br/>
</xsl:template>