Wie schreibe ich ein XSLT, um das folgende XML in das folgende HTML umzuwandeln?
Frage
<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>
Ich möchte es gerne umwandeln
<a href=PropertyURI>Property</a>
<a href=ValueURI>Value</a>
Das Problem besteht darin, dass die Anzahl der Bindungs-Tags unterschiedlich sein kann.Manchmal haben wir möglicherweise nur URIs oder nur Werte.
Wie kann ich in XSLT wissen, ob eine Bindung mit @name=PropertyURI verfügbar ist?
Wenn ja, wie lautet dann der Name des nächsten Bindungsattributs @name?
Lösung
Es gibt bereits eine Antwort, die gültig zu sein scheint, aber ich habe gerade 10 Minuten damit verbracht, den folgenden Code zu testen:
<?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>
Andere Tipps
Es ist nicht ganz klar, wonach Sie suchen, da Ihre Beschreibung des Problems und Ihr gewünschtes Ergebnis nicht miteinander in Zusammenhang zu stehen scheinen.ICH denken Das, was Sie tun möchten, ist, alles zu finden binding
Element mit a uri
Kind, finde das Verwandte binding
Element, das ein hat literal
Kind, und verwenden Sie die uri
Und literal
Werte zum Auffüllen eines a
Element.
Diese Vorlage geht davon aus, dass die beiden binding
Elemente hängen zusammen, weil die name
Attribut auf dem mit dem uri
Kind beginnt mit dem name
Attribut auf dem mit dem literal
Kind, z.B.„PropertyURI“ beginnt mit „Property“ und „ValueURI“ beginnt mit „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>
Wenn das zugehörige Element einfach das ist nächste binding
Element nach dem mit dem uri
Kind, verwenden Sie die obige Vorlage und ersetzen Sie die Variablenzuweisung durch:
<xsl:variable name="literal" select="following-sibling::binding[1]/literal"/>