Frage

Ich erhalte einen 3rd-Party-Feed, von denen mir nicht sicher des Namespace sein kann, damit ich zur Zeit die local-name () Funktion in meinem XSLT zu verwenden, habe die Elementwerte zu erhalten. Allerdings muss ich ein Attribut von einem solchen Element bekommen, und ich weiß nicht, wie dies zu tun, wenn die Namensräume sind unbekannt (daher müssen für local-name () Funktion).

N. B. Ich verwende .net 2.0 die XSLT zu verarbeiten

Hier ist ein Beispiel der XML:

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <id>some id</id>
   <title>some title</title>
   <updated>2008-09-11T15:53:31+01:00</updated>
   <link rel="self" href="http://www.somefeedurl.co.uk" />
   <author>
      <name>some author</name>
      <uri>http://someuri.co.uk</uri>
   </author>
   <generator uri="http://aardvarkmedia.co.uk/">AardvarkMedia script</generator>
   <entry>
      <id>http://soemaddress.co.uk/branded3/80406</id>
      <title type="html">My Ttile</title>
      <link rel="alternate" href="http://www.someurl.co.uk" />
      <updated>2008-02-13T00:00:00+01:00</updated>
      <published>2002-09-11T14:16:20+01:00</published>
      <category term="mycategorytext" label="restaurant">Test</category>
      <content type="xhtml">
         <div xmlns="http://www.w3.org/1999/xhtml">
            <div class="vcard">
               <p class="fn org">some title</p>
               <p class="adr">
                  <abbr class="type" title="POSTAL" />
                  <span class="street-address">54 Some Street</span>
                  ,
                  <span class="locality" />
                  ,
                  <span class="country-name">UK</span>
               </p>
               <p class="tel">
                  <span class="value">0123456789</span>
               </p>
               <div class="geo">
                  <span class="latitude">51.99999</span>
                  ,
                  <span class="longitude">-0.123456</span>
               </div>
               <p class="note">
                  <span class="type">Review</span>
                  <span class="value">Some content</span>
               </p>
               <p class="note">
                  <span class="type">Overall rating</span>
                  <span class="value">8</span>
               </p>
            </div>
         </div>
      </content>
      <category term="cuisine-54" label="Spanish" />
      <Point xmlns="http://www.w3.org/2003/01/geo/wgs84_pos#">
         <lat>51.123456789</lat>
         <long>-0.11111111</long>
      </Point>
   </entry>
</feed>

Dies ist XSLT

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:wgs="http://www.w3.org/2003/01/geo/wgs84_pos#" exclude-result-prefixes="atom wgs">
  <xsl:output method="xml" indent="yes"/>

  <xsl:key name="uniqueVenuesKey" match="entry" use="id"/>
  <xsl:key name="uniqueCategoriesKey" match="entry" use="category/@term"/>

  <xsl:template match="/">
    <locations>
      <!-- Get all unique venues -->
      <xsl:for-each select="/*[local-name()='feed']/*[local-name()='entry']">
        <xsl:variable name="CurrentVenueKey" select="*[local-name()='id']" ></xsl:variable>
        <xsl:variable name="CurrentVenueName" select="*[local-name()='title']" ></xsl:variable>
        <xsl:variable name="CurrentVenueAddress1" select="*[local-name()='content']/*[local-name()='div']/*[local-name()='div']/*[local-name()='p'][@class='adr']/*[local-name()='span'][@class='street-address']" ></xsl:variable>
        <xsl:variable name="CurrentVenueCity" select="*[local-name()='content']/*[local-name()='div']/*[local-name()='div']/*[local-name()='p'][@class='adr']/*[local-name()='span'][@class='locality']" ></xsl:variable>
        <xsl:variable name="CurrentVenuePostcode" select="*[local-name()='postcode']" ></xsl:variable>
        <xsl:variable name="CurrentVenueTelephone" select="*[local-name()='telephone']" ></xsl:variable>
        <xsl:variable name="CurrentVenueLat" select="*[local-name()='Point']/*[local-name()='lat']" ></xsl:variable>
        <xsl:variable name="CurrentVenueLong" select="*[local-name()='Point']/*[local-name()='long']" ></xsl:variable>
        <xsl:variable name="CurrentCategory" select="WHATDOIPUTHERE"></xsl:variable>

            <location>
              <locationName>
                <xsl:value-of select = "$CurrentVenueName" />
              </locationName>
              <category>
                <xsl:value-of select = "$CurrentCategory" />
              </category>
              <description>
                  <xsl:value-of select = "$CurrentVenueName" />
              </description>
              <venueAddress>
                <streetName>
                  <xsl:value-of select = "$CurrentVenueAddress1" />
                </streetName>
                <town>
                  <xsl:value-of select = "$CurrentVenueCity" />
                </town>
                <postcode>
                  <xsl:value-of select = "$CurrentVenuePostcode" />
                </postcode>
                <wgs84_latitude>
                  <xsl:value-of select = "$CurrentVenueLat" />
                </wgs84_latitude>
                <wgs84_longitude>
                  <xsl:value-of select = "$CurrentVenueLong" />
                </wgs84_longitude>
              </venueAddress>
              <venuePhone>
                <phonenumber>
                  <xsl:value-of select = "$CurrentVenueTelephone" />
                </phonenumber>
              </venuePhone>
          </location>
        </xsl:for-each>
    </locations>
  </xsl:template>
</xsl:stylesheet>

Ich versuche, den $ CurrentCategory Variable den entsprechenden Code zu ersetzen, um anzuzeigen mycategorytext

War es hilfreich?

Lösung

ich ein XSLT-Editor nicht hier haben, aber haben Sie versucht mit

*[local-name()='category']/@*[local-name()='term']

Andere Tipps

Nach http: // www. w3.org/TR/2006/REC-xml-names-20060816/#scoping-defaulting

„Default Namespace-Deklarationen gelten nicht direkt Namen zuzuordnen;. Die Interpretation ohne Präfix Attribute durch das Element bestimmt wird, auf der sie erscheinen“

Das bedeutet, dass Ihre Attribute nicht in einem Namespace sind. Verwenden Sie einfach „@term“.

Nur ein bisschen klarer zu sein, gibt es keine Notwendigkeit für die Verwendung von local-namen () dieses Problem zu lösen. Der herkömmliche Weg, damit umzugehen wäre einen Präfix für den Atom-Namensraum in Ihrem XSLT zu erklären, und dann, dass Abfragen in Ihrer XPath verwenden.

Sie haben bereits diese Erklärung auf Ihrer Stylesheet-Elemente (xmlns: Atom = „http://www.w3.org/2005/Atom“) bekommen, so alles, was bleibt, ist, es zu benutzen.

Wie bereits erläutert, wird das Attribut nicht durch den Standard-Namespace betroffen, so dass Ihr Code wie folgt aussehen würde (vorausgesetzt, Sie waren „xmlns: xhtml = ' http://www.w3.org/1999/xhtml '"):

      <xsl:for-each select="/atom:feed/atom:entry">
        <xsl:variable name="CurrentVenueKey" select="atom:id" />
        <xsl:variable name="CurrentVenueName" select="atom:title" />
        <xsl:variable name="CurrentVenueAddress1" 
             select="atom:content/xhtml:div/xhtml:div/xhtml:p[@class='adr']/xhtml:span[@class='street-address']" />
        <xsl:variable name="CurrentVenueCity" 
             select="atom:content/xhtml:div/xhtml:div'/xhtml:p[@class='adr']/xhtml:span[@class='locality'] />
...
        <xsl:variable name="CurrentCategory" select="atom:category/@term" />

..... 

local-name () kann sehr nützlich sein, wenn Sie wirklich, Sie verändern die nicht die Struktur der XML-wissen, aber in diesem Fall, wenn Sie etwas anderes als das erhalten, was Sie erwarten, wird es bricht in jedem Fall.

Ich bin nicht wirklich sicher, warum Sie local-Namen verwenden (), aber wenn Sie ein wenig mehr Informationen teilen, was XSLT-Prozessor Sie verwenden zusammen mit der Sprache, das werde ich sein kann herausgefunden werden, . Ich sage die b / c Sie sollte so etwas wie die Lage zu tun:

<xsl:stylesheet xmlns="http://www.w3.org/2005/Atom" ..>

<xsl:template match="feed">
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="entry">
  ... 
  <xsl:variable name="current-category" select="category/@term" />
  ...
</xsl:template>

Die beiden Dinge, die ich Hilfe der Hoffnung bin sind Sie aus der xmlns-Deklaration an der Spitze ohne Präfix. Das setzt das Standard-Namespace, so dass Sie nicht über die Namespacepräfixe zu verwenden. Ebenso könnte man nennen tun ‚xmlns: a =‚http://www.w3.org/2005/Atom‘‘ und dann tun ‚select =‚a: füttern‘‘. Das andere, was zu bemerken, die ‚@term‘ verwendet, welche Attribute auswählt. Wenn Sie auf einem beliebigen Attribut passen wollte ‚@ *‘ funktioniert genauso wie es wäre für Elemente.

Auch auf dem Prozessor abhängig, könnte es weitere hilfreiche Werkzeuge zur Verfügung, so, wenn Sie ein wenig mehr Informationen zur Verfügung stellen können, es könnte helfen. Auch die XSL-Mailingliste könnte eine weitere hilfreiche Ressource.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top