XSL - نسخ العناصر ولكن إزالة مساحة غير مستخدمة (ق)

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

  •  21-08-2019
  •  | 
  •  

سؤال

ولقد حصلت على بعض XML الذي يعلن مساحة الاسم الذي يستخدم فقط للسمات مثل هذا:

<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:x="http://tempuri.com">
    <b>
        <c x:att="true"/>
        <d>hello</d>
    </b>
</a>

وأريد استخدام XSL لإنشاء نسخة من العقد المحدد وقيمها - التخلص من الصفات. حتى بلدي الناتج المرغوب فيه هو:

<?xml version="1.0" encoding="UTF-8"?>
<b>
    <c />
    <d>hello</d>
</b>

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

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:apply-templates select="/a/b"/>
    </xsl:template>

    <xsl:template match="node()">
        <xsl:copy>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

وو<b xmlns:x="http://tempuri.com"> العنصر الأول من الانتاج بدلا من <b>. لقد حاولت معلنا مساحة الاسم في XSL ووضع بادئة في قائمة exclude-result-prefixes، ولكن هذا لا يبدو أن لديها أي تأثير. ما أفعل الخطأ؟

وUPDATE: لقد وجدت أنه من خلال الإعلان عن مساحة الاسم في XSL وباستخدام السمة extension-element-prefixes يعمل، ولكن هذا لا يبدو على حق! اعتقد انني يمكن استخدام هذا، ولكن أود أن أعرف لماذا لا يعمل exclude-result-prefixes!

وUPDATE: في الواقع، يبدو هذا الحل extension-element-prefixes يعمل فقط مع لXMLSpy المدمج في محرك XSLT، وليس مع MSXML

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

المحلول

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:x="http://tempuri.com">
    <xsl:template match="/">
        <xsl:apply-templates select="/a/b"/>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name(.)}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:copy/>
    </xsl:template>

    <!-- This empty template is not needed.
Neither is the xmlns declaration above:
    <xsl:template match="@x:*"/> -->
</xsl:stylesheet>

ولقد وجدت تفسيرا هنا .

<اقتباس فقرة>   كتب

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

نصائح أخرى

<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:x="http://tempuri.com"
  exclude-result-prefixes="x"
>

  <!-- the identity template copies everything 1:1 -->
  <xsl:template match="@* | node()">
     <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

  <!-- this template explicitly cares for namespace'd attributes -->
  <xsl:template match="@x:*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="." />
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

وهذه محاولة (لاحظ copy-namespaces='no' سمة):

<xsl:template match="node()">
    <xsl:copy copy-namespaces="no">
            <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

وهذا سيزيل س مساحة من الانتاج.

<xsl:namespace-alias result-prefix="#default" stylesheet-prefix="x" />

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

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