كيفية نسخ عقدة معينة (مع الأطفال) من شمل مع زسلت في بيزتالك تحديد مساحة اسم مخصصة?

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

  •  14-12-2019
  •  | 
  •  

سؤال

أنا بحاجة إلى نسخ سوبنود من شمل إلى عقدة معينة من شمل جديد في خريطة بيزتالك باستخدام زسلت.

النظر في شمل المدخلات التالية:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:root xmlns:ns0="http://not/useful/data/">
    <ns0:notuseful>
        <ns0:foo></ns0:foo>
        <ns0:foo2></ns0:foo2>
        <ns0:blabla></ns0:blabla>
    </ns0:notuseful>
    <ns0:data>
        <ns1:usefulDataList xmlns:ns1="http://useful/data/">
            <ns1:usefulData>
                <ns1:usefulChild1></ns1:usefulChild1>
                <ns1:usefulChild2></ns1:usefulChild2>
                <ns1:usefulChild3></ns1:usefulChild3>
                <ns1:usefulChild4></ns1:usefulChild4>
                <ns1:usefulChild5></ns1:usefulChild5>
            </ns1:usefulData>
        </ns1:usefulDataList>
    </ns0:data>
<ns0:root>

ما أحتاجه هو استخراج عقدة تسمى "مفيدة" ، لذلك أنا بحاجة إلى نسخه في شمل جديد مثل هذا واحد:

<?xml version="1.0" encoding="UTF-8"?>
<ns2:root2 xmln:ns2="http://new/xml">
    <ns2:blabla>
        <ns2:stuff />
    </ns2:blabla>
    <ns2:data>
        <ns2:usefulDataList>
            <ns2:usefulData>
                <ns2:usefulChild1></ns2:usefulChild1>
                <ns2:usefulChild2></ns2:usefulChild2>
                <ns2:usefulChild3></ns2:usefulChild3>
                <ns2:usefulChild4></ns2:usefulChild4>
                <ns2:usefulChild5></ns2:usefulChild5>
            </ns2:usefulData>
        </ns2:usefulDataList>
    </ns2:data>
</ns2:root2>

يجب أن يتم ذلك داخل وظيفة بيزتالك ، كما ترى مساحات الأسماء من المصدر والهدف مختلفة.

أنا مبتدئ مطلق مع زسلت ، ولقد تم القيام ببعض الاختبارات ، ولكن لدي شيء خاطئ مع تعبيرات زسلت بلدي:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns2="http://new/xml">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
  <xsl:template name="testTemplate"  match="//*[local-name() = 'usefulDataList ']">
    <xsl:element name="ns0:usefulDataList " namespace="">
      <xsl:apply-templates mode="copy-no-ns" select="usefulDataList"/>
    </xsl:element>
  </xsl:template>
  <xsl:template mode="copy-no-ns" match="*">
    <xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates mode="copy-no-ns"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

أود أن نقدر أي طرف ، مع زسلت أو بيزتالك مخطط.أنا لا أحب ربط كمية كبيرة من الحقول واحدا تلو الآخر إذا كنت يمكن حلها مع تعبير زسلت.

تحياتي.

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

المحلول

حذار كان لديك مساحة في *[local-name() = 'usefulDataList ']" لذلك لن يتطابق ذلك أبدا.هذا يعمل:

<xsl:stylesheet version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:ns2="http://new/xml">

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

<xsl:template match="/">
 <ns2:root>
  <ns2:blabla>
   <ns2:stuff />
  </ns2:blabla>
 <ns2:data>
  <xsl:apply-templates mode="copy-no-ns" select="//*[local-name() = 'usefulDataList']"/>
 </ns2:data>
</ns2:root>
</xsl:template>
<xsl:template mode="copy-no-ns" match="*">
 <xsl:element name="ns2:{local-name(.)}">
  <xsl:copy-of select="@*"/>
  <xsl:apply-templates mode="copy-no-ns"/>
 </xsl:element>
</xsl:template>
</xsl:stylesheet>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top