اختيار سمة من سلف. "../ .." يعمل "السلف :: <اسم العلامة>" لا

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا على التوالي من خلال وثيقة XML، واختيار جميع العناصر، وخلق روابط على أساس سلف التي عادة ما تكون عقدتين تصل في شجرة، ولكن في بعض الأحيان 3 أو 4 العقد تصل. وبالنسبة لغالبية العناصر، وذلك باستخدام <xsl:value-of select="translate(../../@name,$uc,$lc)" /> يعمل على ما يرام، ولكن في الحالات التي يكون فيها سلف هو 3 أو العقد حتى ذلك، أود أن استخدام <xsl:value-of select="translate(ancestor::package/@name,$uc,$lc)" />، ولكن هذا لا يعمل.

وأنا باستخدام xsltproc من روبي ان اؤدي التحويلات XSL.

وشجرة عينة (نعم، فقد XSLT في ذلك، لا، أنا لا أسعى لمعالجة ذلك):

<package name="blork!" xmlns="http://xml.snapin.com/XBL">
  <xsl:template name="doSomething">
    <tokens>
      <token name="text-from-resource" export="public" />
    </tokens>
  </xsl:template>
</package>

ووXSL أنا باستخدام:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s4="http://xml.snapin.com/XBL">
  <xsl:template match="/">
    <xsl:if test="count(//s4:token) >0">
      <xsl:text>Tokens!</xsl:text>
      <xsl:for-each select="//s4:token">
        <xsl:choose>
          <xsl:when test="@export='global'" />
          <xsl:otherwise>
            <xsl:value-of select="translate(ancestor::s4:package/@name,$uc,$lc)" />
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

تحرير: آه، الحق، نسيت مساحة الاسم على تحديد. محلل في العثور على ذلك السلف صحيح بالنسبة لمعظم الحالات، لكنها لا تزال لا يمكن العثور عليه عندما يكون هناك وXSL: العقدة في هناك، والملف الهدف ليس لديه مساحة لXSL. أنا لا ترغب في تعديل الملف الهدف، لأنه رمز الإنتاج --- أنا فقط الكتابة أداة autodoc.

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

المحلول

وربما مساحة المتعلقة مشكلتك. هل غير المدرجة تلك الموجودة في شجرة عينة - هل يمكن أن يكون قليلا أكثر دقة في ما قمت لصق؟ وإذا افترضنا أن العقدة حزمة في نفس مساحة الاسم كما عقدة رمزية، في محاولة:

<xsl:value-of select="translate(ancestor::s4:package/@name,$uc,$lc)" />

ويمكنك أيضا اختبار مجرد اسم غير المشروط، على الرغم من أنه سيكون أبطأ:

<xsl:value-of select="translate(ancestor::*[local-name()='package']/@name,$uc,$lc)" />

وW3C المحلية اسم () المواصفات هنا .

نصائح أخرى

وأعتقد أن هناك أي وسيلة حول الإعلان عن مساحة لإدخال البادئة "XSL" في وثيقة هدف طالما كنت تستخدم معالجات XML-مساحة على علم بها. هل لا نرى أية أخطاء عند محاولة تحويل وثيقة الهدف مع xsltproc وأنماط معينة؟

وقد نقرا مزدوجا تحقق ما هو إصدار XSLT الأدوات الخاصة بك تستخدم. أعتقد XSLT 1.0 لا يدعم "سلف :: <العلامة> ..."

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