كيف يمكنني الحصول على قيمة سمة عند استخدام XSLT مع غير معروف الاسم?

StackOverflow https://stackoverflow.com/questions/76204

  •  09-06-2019
  •  | 
  •  

سؤال

أنا تلقي 3rd الطرف الأعلاف التي لا يمكن أن تكون على يقين من مساحة لذلك أنا حاليا الحاجة إلى استخدام المحلي-اسم() وظيفة في بلدي XSLT للحصول على عنصر القيم.ولكن أنا بحاجة إلى الحصول على سمة من أحد هذه العناصر و أنا لا أعرف كيفية القيام بذلك عندما مساحات غير معروفة (ومن هنا جاءت الحاجة المحلية اسم (وظيفة)).

N. B.أنا باستخدام .net 2.0 إلى عملية XSLT

هنا عينة 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>

هذا هو 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>

أنا أحاول أن استبدال $CurrentCategory متغير الرمز المناسب لعرض mycategorytext

هل كانت مفيدة؟

المحلول

ليس لدي XSLT محرر هنا ، ولكن هل حاولت استخدام

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

نصائح أخرى

وفقا http://www.w3.org/TR/2006/REC-xml-names-20060816/#scoping-defaulting

"الافتراضي مساحة الإعلانات لا تنطبق مباشرة على سمة الأسماء ؛ تفسير unprefixed سمات تحدد العناصر التي تظهر."

وهذا يعني أن الصفات ليست في مساحة اسم.مجرد استخدام "@المدى".

فقط إلى أن يكون قليلا أكثر وضوحا ، ليست هناك حاجة لاستخدام المحلية-اسم() لحل هذه المشكلة.الطريقة التقليدية للتعامل مع وسيكون إعلان بادئة الذرة مساحة في XSLT ، ومن ثم استخدام ذلك في استعلامات xpath.

كنت قد حصلت بالفعل هذا الإعلان على الأنماط الخاصة بك عنصر (xmlns:ذرة="http://www.w3.org/2005/Atom") ، لذلك كل ما تبقى هو استخدامه.

كما سبق أن شرحت السمة لا يتأثر مساحة الاسم الافتراضية ، لذلك الرمز الخاص بك سوف تبدو مثل هذا (على افتراض أن كنت تريد إضافة "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" />

..... 

محلي-اسم() يمكن أن تكون مفيدة جدا إذا كنت حقا لا أعرف بنية XML يمكنك تحويل, ولكن في هذه الحالة إذا كنت تتلقى أي شيء آخر غير ما كنت تتوقع ، وسوف كسر في أي حال.

أنا لست متأكدا حقا لماذا يجب عليك استخدام محلية-اسم(), ولكن إذا كنت تشارك معلومات أكثر قليلا ما xslt المعالج كنت تستخدم جنبا إلى جنب مع اللغة ، سأكون التي يمكن أن أحسب.أقول هذا ب/ج يجب أن تكون قادرة على أن تفعل شيئا مثل:

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

اثنين من الأشياء التي آمل أن تساعدك على الخروج هي xmlns الإعلان في الجزء العلوي من دون بادئة.أن يحدد مساحة الاسم الافتراضية حتى لا تضطر إلى استخدام مساحة الاسم البادئات.وبالمثل ، يمكن الاتصال به 'xmlns:a="http://www.w3.org/2005/Atom"' ثم لا 'select="a:إطعام"'.الشيء الآخر إلى إشعار باستخدام '@مصطلح' الذي يختار الصفات.إذا أردت أن المباراة على أي سمة '@*' يعمل تماما مثل أن العناصر.

مرة أخرى ، اعتمادا على المعالج ، قد يكون هناك غيرها من الأدوات المفيدة في التخلص الخاص بك حتى إذا كنت يمكن أن توفر المزيد من المعلومات التي قد تساعد.أيضا ، XSL القائمة البريدية قد مفيدة أخرى من الموارد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top