如何编写XSLT以在以下HTML中转换以下XML?

时间:2010-04-02 05:17:43

标签: xml xslt sparql

<result>  
   <binding name="PropertyURI">
      <uri>http://dbpedia.org/ontology/motto</uri>
   </binding> 
   <binding name="Property">
      <literal xml:lang="en">motto</literal>
   </binding>
   <binding name="ValueURI">
      <uri>http://dbpedia.org/ontology/motto</uri>
   </binding>
   <binding name="Value">
      <literal>Ittehad, Tanzim, Yaqeen-e-Muhkam(Urdu)</literal>
   </binding>
</result>

我想将其转换为

<a href=PropertyURI>Property</a>
<a href=ValueURI>Value</a>

问题是绑定标签的数量可能不同。有时我们可能只有URI或ony值。

如何在XSLT中知道是否可以使用@ name = PropertyURI进行绑定? 如果是,那么下一个绑定@name属性的名称是什么?

2 个答案:

答案 0 :(得分:1)

已经有一个似乎有效的答案,但我只花了10分钟测试以下代码:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <xsl:apply-templates select="/result/binding[@name='PropertyURI']"/>
</xsl:template>
  <xsl:template match="binding">
    <a>
      <xsl:attribute name="href">
        <xsl:value-of select="./uri"/>
      </xsl:attribute>
      <xsl:value-of select="./following-sibling::binding[1][@name='Property']/literal"/>
    </a>
  </xsl:template>
</xsl:stylesheet> 

答案 1 :(得分:0)

目前还不太清楚您在寻找什么,因为您对问题的描述和您想要的输出似乎并不相关。我认为您想要做的是找到binding个孩子的每个uri元素,找到有binding的相关literal元素子,并使用uriliteral值填充a元素。

此模板假定两个binding元素是相关的,因为name子元素的uri属性以name属性开头,其中literal属性与<xsl:template match="binding[uri]"> <xsl:variable name="name" value="@name"/> <xsl:variable name="literal" select="/result/binding[starts-with($name, @name)]/literal"/> <xsl:if test="$literal"> <a href="{uri}"> <xsl:value-of select="$literal"/> </a> </xsl:if> </xsl:template> 孩子,例如“PropertyURI”以“Property”开头,“ValueURI”以“Value”开头:

binding

如果相关元素只是具有uri子元素的下一个 <xsl:variable name="literal" select="following-sibling::binding[1]/literal"/> 元素,请使用上面的模板,将变量赋值替换为:

{{1}}