XML an identical copy using XSLT

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • kluge.wolfram@googlemail.com

    XML an identical copy using XSLT

    Hi,

    i get stucked on a transformation problem using XSLT. What i need is
    to copy an XML Tree to an output XML without any automatic changes.
    Since i used <xsl:copyor <xsl:copy-ofthere occur unwanted side
    effects.
    For example i just copied a xml were several namespace declarations
    are present more than one time. Then
    the transformation do remove the declaration at the child nodes.
    Another funny automatism is - if i remove a node
    which holds a namespace declaration the first child is inheriting its
    declaration.

    Thank you for your support,

    Im looking forward to hearing from yoou soon.

    Wolfram
  • Martin Honnen

    #2
    Re: XML an identical copy using XSLT

    kluge.wolfram@g ooglemail.com wrote:
    i get stucked on a transformation problem using XSLT. What i need is
    to copy an XML Tree to an output XML without any automatic changes.
    Since i used <xsl:copyor <xsl:copy-ofthere occur unwanted side
    effects.
    For example i just copied a xml were several namespace declarations
    are present more than one time. Then
    the transformation do remove the declaration at the child nodes.
    Another funny automatism is - if i remove a node
    which holds a namespace declaration the first child is inheriting its
    declaration.
    If you have e.g.
    <foo xmlns="http://example.com/2008/ns1">
    <bar>
    <baz/>
    </bar>
    </foo>
    then all three elements are in the namespace
    http://example.com/2008/ns1. Consequently if you copy the bar element
    without its foo parent then the serializer has to add a xmlns
    declaration to make sure the copied element is still in its namespace.

    In the XSLT/XPath 1.0 data model there are namespace nodes which are in
    scope for element nodes. And xsl:copy http://www.w3.org/TR/xslt#copying
    copies these namespace nodes.
    With XSLT 2.0 http://www.w3.org/TR/xslt20/#shallow-copy you can specify
    whether namespaces are copied but for the namespace of the element
    itself that would not prevent the copying of its namespace. If you want
    to strip the namespace of an element then you can't use xsl:copy,
    instead you need to create a new element e.g.

    <xsl:template match="pf1:bar"
    xmlns:pf1="http ://example.com/2008/ns1">

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

    </xsl:template>
    --

    Martin Honnen

    Comment

    • kluge.wolfram@googlemail.com

      #3
      Re: XML an identical copy using XSLT

      On 20 Mai, 13:09, Martin Honnen <mahotr...@yaho o.dewrote:
      kluge.wolf...@g ooglemail.com wrote:
      i get stucked on a transformation problem using XSLT. What i need is
      to copy an XML Tree to an output XML without any automatic changes.
      Since i used <xsl:copyor <xsl:copy-ofthere occur unwanted side
      effects.
      For example i just copied a xml were several namespace declarations
      are present more than one time. Then
      the transformation do remove the declaration at the child nodes.
      Another funny automatism is - if i remove a node
      which holds a namespace declaration the first child is inheriting its
      declaration.
      >
      If you have e.g.
         <foo xmlns="http://example.com/2008/ns1">
           <bar>
             <baz/>
           </bar>
         </foo>
      then all three elements are in the namespacehttp://example.com/2008/ns1. Consequently if you copy the bar element
      without its foo parent then the serializer has to add a xmlns
      declaration to make sure the copied element is still in its namespace.
      >
      In the XSLT/XPath 1.0 data model there are namespace nodes which are in
      scope for element nodes. And xsl:copyhttp://www.w3.org/TR/xslt#copying
      copies these namespace nodes.
      With XSLT 2.0http://www.w3.org/TR/xslt20/#shallow-copyyou can specify
      whether namespaces are copied but for the namespace of the element
      itself that would not prevent the copying of its namespace. If you want
      to strip the namespace of an element then you can't use xsl:copy,
      instead you need to create a new element e.g.
      >
         <xsl:template match="pf1:bar"
           xmlns:pf1="http ://example.com/2008/ns1">
      >
           <xsl:element name="{local-name()}">
             <xsl:apply-templates select="@* | node()"/>
           </xsl:element>
      >
         </xsl:template>
      --
      >
              Martin Honnen
             http://JavaScript.FAQTs.com/
      What i want is the following,

      <ds:foo xmlns:ds="http://example.com/2008/ns1">
      <ds:bar>
      <ds:baz/>
      </ds:bar>
      </ds:foo>

      if i copy the node list ds:bar and ignore <ds:foothen ds:bar gets
      the declaration of foo.

      <ds:bar xmlns:ds="http://example.com/2008/ns1">
      <ds:baz/>
      </ds:bar>

      this is unwanted and i would like to omit this.

      second behavior is ....

      <ds:foo xmlns:ds="http://example.com/2008/ns1">
      <ds:bar xmlns:ds="http://example.com/2008/ns1>
      <ds:baz/>
      </ds:bar>
      </ds:foo>

      and i copy the hole structure the result looks like shown below

      <ds:foo xmlns:ds="http://example.com/2008/ns1">
      <ds:bar>
      <ds:baz/>
      </ds:bar>
      </ds:foo>

      but this arent the exact copies of there sources.

      Thank You for Help

      Wolfram


      Comment

      • Martin Honnen

        #4
        Re: XML an identical copy using XSLT

        kluge.wolfram@g ooglemail.com wrote:
        What i want is the following,
        >
        <ds:foo xmlns:ds="http://example.com/2008/ns1">
        <ds:bar>
        <ds:baz/>
        </ds:bar>
        </ds:foo>
        >
        if i copy the node list ds:bar and ignore <ds:foothen ds:bar gets
        the declaration of foo.
        >
        <ds:bar xmlns:ds="http://example.com/2008/ns1">
        <ds:baz/>
        </ds:bar>
        >
        this is unwanted and i would like to omit this.
        What exactly do you want to omit? As said, if you want to strip the
        namespace of an element node then use
        <xsl:template match="ds:*"
        xmlns:ds="http://example.com/2008/ns1">

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

        </xsl:template>

        but this arent the exact copies of there sources.
        XSLT does not work with the source code, it works on the XSLT/XPath data
        model.

        --

        Martin Honnen

        Comment

        • Ken Starks

          #5
          Re: XML an identical copy using XSLT

          What happens if you try the following? which is actually
          equivalent as far as the __expanded__ namespaces are
          concerned:


          <ds:foo xmlns:ds="http://example.com/2008/ns1">
          <xyz:bar xmlns:xyz="http ://example.com/2008/ns1>
          <ds:baz/>
          </xyz:bar>
          </ds:foo>



          kluge.wolfram@g ooglemail.com wrote:
          >
          <ds:foo xmlns:ds="http://example.com/2008/ns1">
          <ds:bar xmlns:ds="http://example.com/2008/ns1>
          <ds:baz/>
          </ds:bar>
          </ds:foo>
          >
          and i copy the hole structure the result looks like shown below
          >
          <ds:foo xmlns:ds="http://example.com/2008/ns1">
          <ds:bar>
          <ds:baz/>
          </ds:bar>
          </ds:foo>
          >
          but this arent the exact copies of there sources.
          >
          Thank You for Help
          >
          Wolfram
          >
          >

          Comment

          • kluge.wolfram@googlemail.com

            #6
            Re: XML an identical copy using XSLT

            On 20 Mai, 14:19, Ken Starks <stra...@lampsa cos.demon.co.uk wrote:
            What happens if you try the following? which is actually
            equivalent as far as the __expanded__ namespaces are
            concerned:
            >
            <ds:foo xmlns:ds="http://example.com/2008/ns1">
              <xyz:bar xmlns:xyz="http ://example.com/2008/ns1>
                    <ds:baz/>
              </xyz:bar>
            </ds:foo>
            >
            >
            >
            kluge.wolf...@g ooglemail.com wrote:
            >
            <ds:foo xmlns:ds="http://example.com/2008/ns1">
               <ds:bar xmlns:ds="http://example.com/2008/ns1>
                  <ds:baz/>
               </ds:bar>
            </ds:foo>
            >
            and i copy the hole structure the result looks like shown below
            >
            <ds:foo xmlns:ds="http://example.com/2008/ns1">
               <ds:bar>
                  <ds:baz/>
               </ds:bar>
            </ds:foo>
            >
            but this arent the exact copies of there sources.
            >
            Thank You for Help
            >
            Wolfram- Zitierten Text ausblenden -
            >
            - Zitierten Text anzeigen -
            Hi Ken

            this works
            <ds:foo xmlns:ds="http://example.com/2008/ns1">
            <xyz:bar xmlns:xyz="http ://example.com/2008/ns1>
            <ds:baz/>
            </xyz:bar>
            </ds:foo>
            i think the reason why it works it the new namspace prefix.
            But what is going on if redundant namespace declarations occurs.

            Thanks

            Wolfram

            Comment

            • Ken Starks

              #7
              Re: XML an identical copy using XSLT

              >
              Hi Ken
              >
              this works
              >
              ><ds:foo xmlns:ds="http://example.com/2008/ns1">
              > <xyz:bar xmlns:xyz="http ://example.com/2008/ns1>
              > <ds:baz/>
              > </xyz:bar>
              ></ds:foo>
              >
              i think the reason why it works it the new namspace prefix.
              But what is going on if redundant namespace declarations occurs.
              >
              Thanks
              >
              Wolfram
              I believe the xslt processor is allowed to do its own
              thing, in the case of redundant namespaces, but
              I can't say I've read the specifications and seen
              it in black and white.

              Comment

              Working...