Как написать XSLT для преобразования следующего XML в следующий HTML? - PullRequest
0 голосов
/ 02 апреля 2010
<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 или только значения.

Как я могу узнать в XSLT, что если привязка с @ name = PropertyURI доступна?
Если да, то как называется следующий обязательный атрибут @name?

Ответы [ 2 ]

1 голос
/ 02 апреля 2010

Уже есть ответ, который кажется верным, но я потратил 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> 
0 голосов
/ 02 апреля 2010

Не совсем понятно, что вы ищете, так как ваше описание проблемы и желаемый результат не связаны между собой. Я думаю , что вам нужно найти каждый binding элемент с uri дочерним элементом, найти связанный binding элемент с literal дочерним элементом и использовать uri и literal значений для заполнения элемента a.

В этом шаблоне предполагается, что два элемента binding связаны, потому что атрибут name для объекта с дочерним элементом uri начинается с атрибута name для элемента с дочерним элементом literal, например, «PropertyURI» начинается с «Property», а «ValueURI» начинается с «Value»:

<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>

Если связанный элемент является просто элементом next binding после элемента с дочерним элементом uri, используйте указанный выше шаблон, заменив присвоение переменной на:

<xsl:variable name="literal" select="following-sibling::binding[1]/literal"/>
...