2011-10-13 62 views
2

下面是示例XML文件 -仅当网址存在时超链接..?

<?xml version="1.0" encoding="UTF-8"?> 
<Catalog> 
<Book> 
    <AName>Steven Holzner</AName> 
    <BName>Using XSLT</BName> 
    <Pub>ABC Publication </Pub> 
    <Web>http://www.ABCPub.com</Web> 
</Book> 
<Book> 
    <AName>Steven Holzner</AName> 
    <BName>Using HTML</BName> 
    <Pub>XYZ Publication </Pub> 
    <Web></Web> 
</Book> 
</Catalog> 

我想如果网络地址,则其他明智的只是酒吧的名字瓦特/ OA链接到超链接的酒吧名称...

我的XSL代码是在这里 -

<xsl:template match="Catalog"> 
    <xsl:for-each select="Book"> 
    <p><a> 
    <xsl:attribute name="href"> 
     <xsl:value-of select="Web"/> 
    </xsl:attribute> 

    <xsl:value-of select="Pub"/> 
    </a></p> 
    </xsl:for-each> 
</xsl:template> 

我想下面的HTML源 -

<p> < A HREF =“HT TP://www.ABCPub.com” > ABC公布</A > </P > <p> XYZ出版</A > </P >

RightNow公司,这个XSL给超级链接标签,即使浏览网址没有给出.. 什么代码将做需要..?

有一个愉快的一天 - 约翰

+1

好问题,+1。 XSLT是一种功能强大而且非常具有表现力的语言,它可以在没有任何条件,循环结构或单独的属性生成指令的情况下,以最少数量的行来解决此问题。 –

回答

1

这可以用很短的和简单的改造来实现 - 没有<xsl:for-each>,没有<xsl:if><xsl:choose><xsl:when>,没有<xsl:attribute>在所有

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="Book[Web/text()]"> 
    <p> 
     <a href="{Web}"> 
     <xsl:value-of select="Pub"/> 
     </a> 
    </p> 
</xsl:template> 

<xsl:template match="Book"> 
    <p> 
     <xsl:value-of select="Pub"/> 
    </p> 
</xsl:template> 
</xsl:stylesheet> 

当这种转变是在所提供的XML文档应用:

<Catalog> 
    <Book> 
     <AName>Steven Holzner</AName> 
     <BName>Using XSLT</BName> 
     <Pub>ABC Publication </Pub> 
     <Web>http://www.ABCPub.com</Web> 
    </Book> 
    <Book> 
     <AName>Steven Holzner</AName> 
     <BName>Using HTML</BName> 
     <Pub>XYZ Publication </Pub> 
     <Web></Web> 
    </Book> 
</Catalog> 

想要的,正确的结果产生

<p> 
    <a href="http://www.ABCPub.com">ABC Publication </a> 
</p> 
<p>XYZ Publication </p> 

说明:模板模式匹配。

+0

最后一些AVT的:-)非常好的Dimitre。 +1 –

+0

@DevNull:不客气:) –

+0

@Demitre ...非常感谢... :) – John

1

只是测试如果网站是充满了选择/时/其他

<xsl:template match="Catalog"> 
    <xsl:for-each select="Book"> 
    <p><xsl:choose> 
<xsl:when test="string(Web)"><a> 
    <xsl:attribute name="href"> 
     <xsl:value-of select="Web"/> 
    </xsl:attribute> 

    <xsl:value-of select="Pub"/> 
    </a> 
</xsl:when> 
<xsl:otherwise> 
<xsl:value-of select="Pub"/> 
</xsl:othwerwise> 
</xsl:choose> 
</p> 
    </xsl:for-each> 
</xsl:template> 
+0

谢谢Nin ...非常感谢亲爱的...它的工作.. – John

0
<xsl:if test="Web != ''"> 
    <a> 
    <xsl:attribute name="href"> 
     <xsl:value-of select="Web"/> 
    </xsl:attribute> 
    <xsl:value-of select="Pub"/> 
    </a> 
</xsl:if> 

^将显示出版商只有在有网络地址,你想要的是一个xsl:选择...

<xsl:choose> 
    <xsl:when test="Web != ''"> 
     <a> 
     <xsl:attribute name="href"> 
      <xsl:value-of select="Web"/> 
     </xsl:attribute> 
     <xsl:value-of select="Pub"/> 
     </a> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="Pub"/> 
    </xsl:otherwise> 
</xsl:choose> 
+0

谢谢谢尔多,你的第二个对我来说已经足够了。第一个可能来救援未来;)..再次感谢.. – John