使用XPath和XSLT超链接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文件

<?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>