使用XPath和XSLT对XML子元素进行超链接

时间:2013-03-14 23:47:47

标签: 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 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>

从上面的代码中可以看出,我在“movie”元素中有5个actor。前两个演员包含4个子元素 (name,age,height和from)以及“name”元素中的属性“link”,它提供指向特定actor页面的超链接。其他3个演员只包含元素“name”。

我希望我的页面在列表中显示5个actor的名字,前2个名称显示为超链接(链接到特定的actor页面),另外3个显示为常规文本。

我想区分超链接名称和常规名称的方式是通过XPath。 我希望所有包含多个子元素的“actor”元素(在本例中为name,age,height和from)显示为超链接。 包含不超过1个子元素的所有其他“actor”元素将显示为常规文本

这是我的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,我只获得了前两个演员的名字(在Xpath notepad ++插件中测试过)。 我只是不知道如何正确地将它们与“链接”属性连接起来并在页面上显示它们。

这是我想要达到的最终结果:

actors image

前两个actor的名称是超链接的,因为“actor”元素包含多个子元素。 其他3个“actor”元素只包含1个子元素,因此它们对应的“名称”显示为纯文本。

1 个答案:

答案 0 :(得分:1)

当然,一种更简单的方法就是直接将模板应用于name元素,并区分具有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>