سؤال

لدي عدة ملفات xml أسماء التي يتم تخزينها في ملف xml.

أريد أن استخدام xsl موجزا مزيج من ملفات xml.أتذكر كان هناك طريقة للقيام بذلك مع msxml امتداد (أنا باستخدام الإصدار msxml).

وأنا أعلم أنني يمكن الحصول على محتوى كل ملف باستخدام select="document(filename)" ولكن انا غير متأكد من كيفية الجمع بين كل هذه الوثائق إلى واحد.

21-Oct-08 كان يجب أن أذكر أن كنت تريد أن تفعل مزيد من المعالجة على جنبا إلى جنب xml, لذلك لا يكفي فقط الناتج من تحويل أحتاج إلى متجر أنها عقدة في متغير.

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

المحلول

هنا هو مجرد مثال صغير من ما كنت يمكن أن هل:

file1.xml:

<foo>
<bar>Text from file1</bar>
</foo>

file2.xml:

<foo>
<bar>Text from file2</bar>
</foo>

index.xml:

<index>
<filename>file1.xml</filename>
<filename>file2.xml</filename>

تلخيص.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">

  <xsl:variable name="big-doc-rtf">
      <xsl:for-each select="/index/filename">
        <xsl:copy-of select="document(.)"/>
      </xsl:for-each>
  </xsl:variable>

  <xsl:variable name="big-doc" select="exsl:node-set($big-doc-rtf)"/>

  <xsl:template match="/">
    <xsl:element name="summary">
      <xsl:apply-templates select="$big-doc/foo"/>
    </xsl:element>  
  </xsl:template>

  <xsl:template match="foo">
    <xsl:element name="text">
      <xsl:value-of select="bar"/>
    </xsl:element>  
  </xsl:template>

</xsl:stylesheet>

تطبيق ورقة أنماط index.xml يعطيك:

<?xml version="1.0" encoding="UTF-8"?><summary><text>Text from file1</text><text>Text from file2</text></summary>

هو خدعة لتحميل وثائق مختلفة مع الوثيقة وظيفة (وظيفة ملحق معتمد من قبل تقريبا كل XSLT 1.0 المعالجات) ، إخراج محتويات كجزء من متغير الجسم ومن ثم تحويل المتغير إلى عقدة مجموعة لمزيد من المعالجة.

نصائح أخرى

وافترض أن لديك أسماء الملفات المدرجة في ملف مثل هذا:

<files>
    <file>a.xml</file>
    <file>b.xml</file>
</files>

وثم هل يمكن استخدام ورقة أنماط من هذا القبيل على الملف أعلاه:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="files/file"/>                          
        </root>
    </xsl:template>

    <xsl:template match="file">
        <xsl:copy-of select="document(.)"/>
    </xsl:template>
</xsl:stylesheet>

إلقاء نظرة على document() وظيفة الوثائق.

يمكنك استخدام document() لتحميل المزيد من مستندات XML خلال عملية التحول.يتم تحميلها كما عقدة مجموعات.هذا يعني أنك في البداية تغذية XML الذي يحتوي على أسماء الملفات لتحميل XSLT و أعتبر من هناك:

<xsl:copy-of select="document(@href)/"/>

وشكرا لجميع الأجوبة. وهنا الشجاعة من الحل أنا باستخدام مع MSXML.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="urn:schemas-microsoft-com:xslt">
  <xsl:output method="xml"/>
  <xsl:template match="/">
    <xsl:variable name="combined">
      <xsl:apply-templates select="files"/>
    </xsl:variable>
    <xsl:copy-of select="ms:node-set($combined)"/>
  </xsl:template>
  <xsl:template match="files">
    <multifile>
      <xsl:apply-templates select="file"/>
    </multifile>
  </xsl:template>
  <xsl:template match="file">
    <xsl:copy-of select="document(@name)"/>
  </xsl:template>
</xsl:stylesheet>

والآن أحاول تحسين الأداء حيث أن كل ملف حوالي 8 MB والتحول وقتا طويلا جدا، ولكن هذا سؤال آخر.

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