在XSL中使用style属性构建锚标记

时间:2012-12-24 07:37:58

标签: xslt styles anchor

我没有接受过XSL的正式培训,对我来说是全新的。基本上我有一个XML文件如下:

<document document="wpc_article_video_qp">
  <properties>
    <property type="name" prop_ns="http://sapportals.com/xmlns/cm" prop_name="displayname"/>
    <property type="createdBy">USER.PRIVATE_DATASOURCE.un:LU23921</property>
    <property type="includeInRSS" prop_ns="wpc_wcm" prop_name="wpc_wcm_rss"/>
    <property type="displayNewIcon" prop_ns="wpc_wcm" prop_name="wpc_wcm_new"/>
  </properties>
  <elements>
    <element type="videotitle">TestTitle</element>
    <element type="videopath">ICT/LB_1152kbps.mp4</element>
    <element type="videowidth">500</element>
    <element type="videoheight">250</element>
  </elements>
  <relatedlinks/>
  <relatedfiles/>
</document>

我无法控制XML。我的意思是XML是由工具生成的,我不能改变它。我现在要做的是编写XSL,它应该生成一个锚标记,如下所示:

<a style="display:block;width:500px;height:250px" id="player" href="ICT/LB_1152kbps.mp4"></a>

其中href,width和height分别从“videopath”,“videowidth”和“videoheight”XML元素中选取。

我试图在这个网站和其他一些网站上搜索,但正如我所说,因为我是XSL的新手,我真的不知道从哪里开始。任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

如果您正在寻找一个好的开始,我建议您在图书馆中阅读一本XSLT书籍,或者查看一些在线教程,例如the one by Zvon。在编写XSLT时,我强烈推荐使用spezicalized编辑器lixe oXygen。它不仅可以避免您使用自动完成功能键入很多内容,还可以自动关闭标签,还可以检查所有程序代码和XPath语法是否有效。

这里的问题是:您可能生成一个完整的HTML文档,而不仅仅是一个锚标记。所以,这是一个模板,它通过匹配<element>元素生成锚标记,但必须集成到整个样式表中:

<xsl:template match="element">
  <a style="display:block;
            width:{element/@videowidth}px;
            height:{element/@videoheight}px" 
     id="player" href="{element/@videopath}"></a>
</xsl:template>

编辑:如果您真的想要一个仅包含锚标记的输出文档:XSLT处理器开始在根节点处理输入文档,然后在您使用{告诉它时逐步执行元素{1}}(或<xsl:apply-templates>)。如果您希望匹配<xsl:for-each>的模板实际启动,则必须从文档元素上下文“移动”到该上下文:

<element>

答案 1 :(得分:0)

以下是使用AVT(属性值模板)执行此操作的方法:

<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="elements">
     <xsl:copy>
       <a style="display:block;
                 width:{*[@type='videowidth']}px;
                 height:{*[@type='videoheight']}px"
                 id="player" href="{*[@type='videopath']}"></a>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

请注意

上面的CSS属性各自都在新行上 - 这样做是为了提高可读性。在一个真正的转变中,人们可能希望保留它们而不需要插入空间 - 在没有空间的情况下产生想要的结果。

在提供的XML文档上应用此转换时:

<document document="wpc_article_video_qp">
  <properties>
    <property type="name" prop_ns="http://sapportals.com/xmlns/cm" prop_name="displayname"/>
    <property type="createdBy">USER.PRIVATE_DATASOURCE.un:LU23921</property>
    <property type="includeInRSS" prop_ns="wpc_wcm" prop_name="wpc_wcm_rss"/>
    <property type="displayNewIcon" prop_ns="wpc_wcm" prop_name="wpc_wcm_new"/>
  </properties>
  <elements>
    <element type="videotitle">TestTitle</element>
    <element type="videopath">ICT/LB_1152kbps.mp4</element>
    <element type="videowidth">500</element>
    <element type="videoheight">250</element>
  </elements>
  <relatedlinks/>
  <relatedfiles/>
</document>

产生了想要的正确结果:

<elements>
   <a style="display:block;width:500px;height:250px" id="player" href="ICT/LB_1152kbps.mp4"/>
</elements>