【问题标题】:Hyperlink an XML child element with XPath and XSLT使用 XPath 和 XSLT 超链接 XML 子元素
【发布时间】:2015-02-11 07:00:29
【问题描述】:

我有一个存储电影及其演员的 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 个子元素 (姓名、年龄、身高和来自)以及“姓名”元素内的“链接”属性,该属性提供到特定演员页面的超链接。其他 3 个 actor 仅包含元素“name”。

我希望我的页面在列表中显示 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()&gt;1]/../name,但我确实只显示了前 2 个演员的名字(在 Xpath notepad++ 插件中测试)。 我只是不知道如何将它们与“链接”属性正确连接并显示在页面上。

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

前 2 个演员的名字是超链接的,因为“演员”元素包含超过 1 个子元素。 其他 3 个“actor”元素仅包含 1 个子元素,因此它们对应的“名称”显示为纯文本。

【问题讨论】:

    标签: xml xslt xpath hyperlink


    【解决方案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>
    

    【讨论】:

    • 这确实是一个更容易的方法,伊恩。非常感谢您的帮助!
    • @Alex 如果您确实想根据子元素的数量进行区分,那么您可以通过制作第一个模板match="actor[count(*) &amp;gt; 1]/name" 来做到这一点,但[@link] 版本可以更好地捕捉实际语义。
    • 根据“link”属性来区分子元素更有意义,也简单很多。但也感谢您为我提供第二个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多