كيف تكتب XSLT لتحويل XML التالي في HTML التالي؟

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

  •  23-09-2019
  •  | 
  •  

سؤال

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

المشكلة هي أن عدد علامات الربط يمكن أن يختلف. في بعض الأحيان قد يكون لدينا فقط قيم URIS أو ony.

كيف يمكنني أن أعرف في XSLT أنه إذا كان الربط مع @name = propertyuri متاحًا؟
إذا كانت الإجابة بنعم ، فما اسم سمة Nextname @name التالية؟

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

المحلول

هناك بالفعل إجابة تبدو صالحة لكنني أمضيت للتو 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> 

نصائح أخرى

ليس من الواضح تمامًا ما تبحث عنه ، لأن وصفك للمشكلة والإخراج المطلوب لا يبدو مرتبطًا. أنا فكر في أن ما تريد القيام به هو العثور على كل binding عنصر مع uri طفل ، ابحث عن الصلة binding العنصر الذي لديه ملف literal الطفل ، واستخدم uri و literal القيم لملء a عنصر.

هذا القالب يفترض أن الاثنين binding العناصر مرتبطة لأن ال name ميزة على واحد مع uri يبدأ الطفل بـ name ميزة على واحد مع literal الطفل ، مثل "propertyuri" يبدأ بـ "خاصية" و "Valueuri" يبدأ بـ "القيمة":

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

إذا كان العنصر ذي الصلة هو ببساطة التالي binding العنصر بعد واحد مع uri الطفل ، استخدم القالب أعلاه ، استبدال المهمة المتغيرة مع:

<xsl:variable name="literal" select="following-sibling::binding[1]/literal"/>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top