سؤال

ولقد حصلت على بعض XML، لأغراض سبيل المثال يبدو مثل هذا:

<root>
    <field1>test</field1>
    <f2>t2</f2>
    <f2>t3</f2>
</root>

وأريد أن تحويلها مع XSLT، ولكن أريد أن قمع العنصر F2 الثاني في الإخراج - كيف يمكنني التحقق من داخل قالب جهدي لمعرفة ما إذا كان عنصر F2 موجود بالفعل في الانتاج عندما العنصر F2 الثاني في مصدر جاري العمل؟ بلدي XSLT يبدو شيئا من هذا القبيل في الوقت الحاضر:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="no" omit-xml-declaration="yes" standalone="no" />
  <xsl:template match="/">
    <xsl:for-each select="./root">
      <output>
        <xsl:apply-templates />        
      </output>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="*" >
      <xsl:element name="{name(.)}">
        <xsl:value-of select="." />
      </xsl:element>
  </xsl:template>
</xsl:stylesheet>

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

.

وتحرير: هل نسيت العلامات قبل، يجب أن يكون رمز مرئية الآن

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

المحلول

والامر يعتمد على كيفية نظام واسع كنت تريد أن تكون.

وأي بمعنى. هل تهتم فقط مع العناصر التي من الأطفال من نفس الأم، أو كل العناصر على نفس المستوى ( 'أبناء عمومة "إذا أردت) أو عناصر أي مكان في المستند ...

في الحالة الأولى يمكن أن تحقق محور السابقة-الأخوة أن نرى في حالة وجود أي عناصر أخرى بنفس الاسم.

<xsl:if test="count(preceding-sibling::node()[name()=name(current())])=0">
  ... do stuff in here.
</xsl:if>

نصائح أخرى

لالاختيار الوحيد (ويحذرك من نسخة مكررة)، قد تجد <لأ href = "http://www.biglist.com/lists/lists.mulberrytech.com/xsl-list/archives/200807/ msg00444.html "يختلط =" نوفولو noreferrer "> مثال هنا

شيء على غرار:

<xsl:for-each-group select="collection(...)//@id" group-by=".">
  <xsl:if test="count(current-group()) ne 1">
    <xsl:message>Id value <xsl:value-of select="current-grouping-key()"/> is 
       duplicated in files
       <xsl:value-of select="current-group()/document-uri(/)" separator=" and
    "/></xsl:message>
  </xsl:if>
 </xsl:for-each-group>

لتعديلها لتحديد كافة العقد ضمن جذر 'العنصر.

وأما بالنسبة لإزالة خطوط مكررة، لديك مثال آخر هنا

وهذا من شأنه أن تبدو مثل:

<xsl:stylesheet>
  <xsl:key name="xyz" match="record[x/y/z]" use="x/y/z" />
  <xsl:variable name="noxyzdups" select="/path/to/record[generate-id(.) = generate-id(key('xyz', x/y/z))]" />
...
  <xsl:template ... >
    <xsl:copy-of "exslt:node-set($noxyzdups)" />
  </xsl:template>
</xsl:stylesheet>

س / ص / ض هو تعبير XPath الذي تريد جعل فريدة من نوعها. ويمكن أن يكون CONCAT (س، '-'، @ ص، '-'، ض) أو ما تريد.

والآن أنا لست متأكدا يمكن بسهولة أن تتكيف هذين المثالين لقضيتك، ولكن أردت فقط أن أشير إلى هذين المصدرين، في حالة أن يساعد.

وليس من الممكن لاستجواب الناتج من التحويل الخاصة بك. كما أنه ليس من الممكن تتبع الحالة الراهنة للالتحويل الخاصة بك (أي تتبع ما الليمفاوية كنت قد تنبعث في متغير). في الأساس، وهذا ليس كيف يعمل XSLT. واحد من تكاليف بيئة البرمجة خالية من الآثار الجانبية هو أنك لا تستطيع أن تفعل الأشياء التي يكون لها آثار جانبية. يا جيدا.

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

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