XSL - 带链接的图像

时间:2014-04-15 07:46:24

标签: xml xslt

我有一个XML文档如下。

<?xml version="1.0"?>
<document document="wpc_slider_qp"> 
<properties> 
    <property prop_name="displayname" prop_ns="http://sapportals.com/xmlns/cm" type="filename"/>
    <property type="createdBy">USER.PRIVATE_DATASOURCE.un:LU23921</property> 
</properties>
<elements>
    <element type="sliderimage" alt="Slider 1 Tooltip" width="700" height="306">="/irj/go/km/docs/wpccontent/Sites/Administration/Site Content/image-slider-1.jpg</element>
    <element title="" type="sliderlink" linkid="2ece8f2a15920a838038554563a046b2" targetnew="false" rid="http://www.google.com"/>
    <element type="sliderimage" alt="Slider 2 Tooltip" width="700" height="306">="/irj/go/km/docs/wpccontent/Sites/Administration/Site Content/image-slider-2.jpg</element>
    <element title="" type="sliderlink" linkid="75af9a52cab35aa864d80f4563a0db8f" targetnew="false" rid="http://www.yahoo.com"/>
</elements>
<relatedlinks/>
<relatedfiles/>
</document>

我想使用XSL将其转换为链接此...

<div id="sliderFrame">
    <div id="slider">
        <a href="http://www.google.com"><img border="0" src="/irj/go/km/docs/wpccontent/Sites/Administration/Site Content/image-slider-1.jpg" height="306" width="700"/></a>
        <a href="http://www.yahoo.com"><img border="0" src="/irj/go/km/docs/wpccontent/Sites/Administration/Site Content/image-slider-2.jpg" height="306" width="700"/></a>
    </div>
</div>

到目前为止,这是我的XSL ......

<?xml version="1.0"?>

<!DOCTYPE stylesheet [
<!ENTITY apos  "&#39;" ><!-- replace &apos; with html escape character for ' -->
]>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  xmlns:wpc="com.sap.nw.wpc.km.service.editor.xslt.XsltHelperCore">
    <xsl:template match="/">

    <xsl:output method="html"/>


<html>
<head>

    <link href="js-image-slider.css" rel="stylesheet" type="text/css" />
    <script src="js-image-slider.js" type="text/javascript">function empty() return;</script>
</head>



<div id='sliderFrame'>
    <div id='slider'>
        <xsl:for-each select="document/elements/element">
            <xsl:if test="@type='sliderimage'">
                        <img border="0">
                                <xsl:attribute name="src"><xsl:value-of disable-output-escaping="yes" select="wpc:getWebDavAccess(string(current()))"/></xsl:attribute>
                                    <xsl:if test="string-length(@height)!=0">
                                        <xsl:attribute name="height"><xsl:value-of disable-output-escaping="yes" select="@height"/></xsl:attribute>
                            </xsl:if>
                                    <xsl:if test="string-length(@width)!=0">
                                <xsl:attribute name="width"><xsl:value-of disable-output-escaping="yes" select="@width"/></xsl:attribute>
                            </xsl:if>
                            <xsl:if test="string-length(document/elements/element[@type='sliderimage']/@alt)!=0">
                                <xsl:attribute name="alt"><xsl:value-of disable-output-escaping="yes" select="document/elements/element[@type='sliderimage']/@alt"/></xsl:attribute>
                            </xsl:if>
                            </img>  
            </xsl:if> 
        </xsl:for-each>
    </div>
</div>


<br />
<br />



        <xsl:for-each select="document/elements/element">
            <xsl:if test="@type='sliderlink'">
                    <a>
                        <xsl:attribute name="href">
                            <xsl:value-of disable-output-escaping="yes" select="wpc:getHrefValue(string(current()/@rid), string(/document/@locale))"/>
                        </xsl:attribute>
                        <xsl:attribute name="onclick">
                            <xsl:value-of disable-output-escaping="yes" select="wpc:getOnClickValue(string(current()/@rid), string(/document/@locale),string(document/elements/element[@type='sliderlink']/@targetnew))"/>
                        </xsl:attribute>
                        <xsl:attribute name="target">
                            <xsl:value-of disable-output-escaping="yes" select="wpc:getTarget(string(current()/@targetnew))"/>
                        </xsl:attribute>
test
                    </a>
            </xsl:if> 
        </xsl:for-each>


</html>

</xsl:template>

</xsl:stylesheet>

我能够将图像一个接一个地拍摄,但我无法弄清楚如何在图像周围添加A标记。任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

你不应该尝试将XSLT中的所有内容都放在1个模板匹配中,这样就会变得非常复杂并且很难快速阅读。

这将提供您想要的输出:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="html" indent="yes"/>

<xsl:template match="document">
    <html>
        <head>
            <link href="js-image-slider.css" rel="stylesheet" type="text/css"/>
            <script src="js-image-slider.js" type="text/javascript">function empty() return;</script>
        </head>
        <body>
            <xsl:apply-templates select="elements"/>
        </body>
    </html>
</xsl:template>

<xsl:template match="elements">
    <div id="sliderFrame">
        <div id="slider">
            <xsl:apply-templates select="element[@type='sliderlink']"/>
        </div>
    </div>
</xsl:template>

<xsl:template match="element[@type='sliderlink']">
    <a href="{@rid}">
        <xsl:apply-templates select="preceding-sibling::element[@type='sliderimage'][1]"/>
    </a>
</xsl:template>

<xsl:template match="element[@type='sliderimage']">
    <img border="0" src="{substring(.,3)}" height="{@height}" width="{@width}"/>
</xsl:template>

</xsl:stylesheet>

所以你要做的不是把它全部放在一个大模板中,而是建立一系列模板来拼接你想要的输出,这也更加灵活。


修改

在回复评论时,要访问element中的内容,请使用.,因此如果wpc:getWebDavAccess用于处理src,您可以执行以下操作:

<xsl:template match="element[@type='sliderimage']">
    <img border="0" src="{wpc:getWebDavAccess(.)}" height="{@height}" width="{@width}"/>
</xsl:template>

我用substring取代了它。

XSLT中的花括号与value-of select相同,您可以像这样编写相同的代码:

<xsl:template match="element[@type='sliderimage']">
    <img border="0">
    <xsl:attribute name="src">
        <xsl:value-of select="wpc:getWebDavAccess(.)"/>
    </xsl:attribute>
    <xsl:attribute name="height">
        <xsl:value-of select="@height"/>
    </xsl:attribute>
    <xsl:attribute name="width">
        <xsl:value-of select="@width"/>
    </xsl:attribute>
    </img>
</xsl:template>