سؤال

لست متأكدًا مما إذا كان ذلك ممكنًا، لأنني جديد جدًا في استخدام XSLT وما إلى ذلك، ولكن ربما يستطيع بعضكم مساعدتي هنا؟إنه أمر صعب بعض الشيء ولم أجد شيئًا مثله على الإنترنت:

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

<order
  xmlns="some.url.01"
  xmlns:ns2="some.other.url"
  xmlns:ns3="another.one"
>
  <orderEntry>
    <orderControl>
      <mandant>test</mandant>
      <businessUnit>test</businessUnit>
      <inboundChannel>test</inboundChannel>
      <timestamp>timestamp</timestamp>
      <requestedDocuments>
        <ns2:document>orderForm</ns2:document>
      </requestedDocuments>
    </orderControl>
  </orderEntry>
</order>

يجب أن يبدو ملف XML الناتج كما يلي:

<order
  xmlns="some.url.02"
  xmlns:ns2="some.other.url.02"
  xmlns:ns3="another.one.02"
>
  <orderEntry>
    <orderControl>
      <mandant>test</mandant>
      <businessUnit>test</businessUnit>
      <inboundChannel>test</inboundChannel>
      <!-- deleted timestamp for example -->
      <requestedDocuments>
        <ns2:document>orderForm</ns2:document>
      </requestedDocuments>
    </orderControl>
  </orderEntry>
</order>

ولكن الشيء الوحيد الذي أحصل عليه هو:

<order
  xmlns="some.url.02"
>
  <orderEntry>
    <orderControl>
      <mandant>test</mandant>
      <businessUnit>test</businessUnit>
      <inboundChannel>test</inboundChannel>
      <!-- deleted timestamp for example -->
      <requestedDocuments>
        <ns2:document xmlns:ns2="some.other.url.02">orderForm</ns2:document>
      </requestedDocuments>
    </orderControl>
  </orderEntry>
</order>

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

يبدو XSLT الخاص بي كما يلي:

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="some.url.02"
  xmlns:ns2="some.other.url.02"
  xmlns:ns3="another.one.02"
>
  <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>

  <xsl:strip-space elements="*"/>

  <xsl:template match="*">
    <xsl:choose>
      <xsl:when test="name(.) != 'timestamp'">
        <xsl:element name="{node-name(.)}">
          <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
      </xsl:when>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="@*">
    <xsl:attribute name="{node-name(.)}">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

يمكن للشخص الرجاء المساعدة؟مساحات الأسماء صعبة :(

ملاحظة.:من قام بتحرير مشاركتي:شكرًا :)

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

المحلول

يمكنك تعيين مساحة الاسم على عنصر الإخراج باستخدام سمة مساحة الاسم:

<xsl:element name="{node-name(.)}" namespace="http://www.bar.org">
  // ...
</xsl:element>

لاحظ أن مساحة الاسم يجب أن تكون عنوان URI وعلى الرغم من أنني أتوقع أنك تعرف ذلك، فمن المحتمل أن يكون استخدام معرفات URI في المثال الخاص بك فكرة جيدة.

فيما يلي رابط لبرنامج ZVON التعليمي الممتاز الذي يحتوي على أمثلة ناجحة:http://www.zvon.org/xxl/XSLTreference/Output/xslt_element_namespace.html

أوافق على أن مساحات الأسماء صعبة.كما تعلم، فإن البادئة ليست ذات صلة لغويًا، لكن العديد من الأنظمة تسمح لك باختيار البادئة لأسباب جمالية.انظر أيضًا إلى الساكسونيين (http://saxon.sourceforge.net/)

يحرر أعتقد أنك ستجد إجابتك هنا:مساحة اسم علامة جذر XSLT بدلاً من مساحة اسم سمة العنصر

نصائح أخرى

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:ns1_src="some.url.01"
  xmlns:ns2_src="some.other.url"
  xmlns:ns3_src="another.one"
  xmlns="some.url.02"
  xmlns:ns2="some.other.url.02"
  xmlns:ns3="another.one.02"
>
  <!-- 
    Note that all the source namespaces got their own new "*_src" prefix. 
    The target namespaces take over the original prefixes. 
    "some.url.02" is the new global namespace.
  -->

  <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <!-- the identity template to copy everything, unless 
       it has been declared otherwise -->
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>

  <!-- three templates to handle elements -->
  <xsl:template match="ns1_src:*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="node() | @*" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="ns2_src:*">
    <xsl:element name="ns2:{local-name()}">
      <xsl:apply-templates select="node() | @*" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="ns3_src:*">
    <xsl:element name="ns3:{local-name()}">
      <xsl:apply-templates select="node() | @*" />
    </xsl:element>
  </xsl:template>

  <!-- three templates to handle attributes -->
  <xsl:template match="@ns1_src:*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="." />
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="@ns2_src:*">
    <xsl:attribute name="ns2:{local-name()}">
      <xsl:value-of select="." />
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="@ns3_src:*">
    <xsl:attribute name="ns3:{local-name()}">
      <xsl:value-of select="." />
    </xsl:attribute>
  </xsl:template>

  <!-- timestamps will be ignored -->
  <xsl:template match="ns1_src:timestamp" />

</xsl:stylesheet>

وإخراج:

<order xmlns="some.url.02">
  <orderEntry>
    <orderControl>
      <mandant>test</mandant>
      <businessUnit>test</businessUnit>
      <inboundChannel>test</inboundChannel>
      <requestedDocuments>
        <ns2:document xmlns:ns2="some.other.url.02">orderForm</ns2:document>
      </requestedDocuments>
    </orderControl>
  </orderEntry>
</order>
<xsl:template match="a:*">
  <xsl:element name="{local-name()}"
               namespace="http://example.com/B">
    <xsl:copy-of select="@*" />
    <xsl:apply-templates />
  </xsl:element>
</xsl:template>

وانه يبحث عن أي عنصر في مساحة الاسم مع a البادئة ويستبدلها مع عنصر بنفس الاسم من http://example.com/B مساحة الاسم. يتم نسخ كافة سمات "كما هي" وبعد ذلك يتم تقييم جميع الأطفال.

واضافة تجهيز عهدك في أو حول ذلك حسب الحاجة.

هل تستخدم مهمة Ant XSLT لإجراء التحويل؟

إذا كانت الإجابة بنعم، فقد ترغب في التبديل من محرك XSLT الافتراضي الذي يأتي مع Sun JDK 1.5+.يقرأ هذا.

اقرأ أيضا هذا المقال حول مساحات الأسماء في XSLT

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