Frage

Ich bin mir nicht sicher, ob das möglich ist, wie ich zu XSLT und Sachen bin sehr neu, aber einige von euch könnten vielleicht mir hier helfen? Es ist ein bisschen schwierig und ich habe nicht alles wie es im Internet zu finden:

Das Problem ist, dass ich einen Eingang xml mit Namensräumen habe erklärt und alle, und ich brauche nur geringfügige Änderungen daran (Hinzufügen oder Löschen von Attributen oder verschieben sie an anderen Orten) zu machen. Aber zur gleichen Zeit, ich habe den Namespace-Verweis im Dokument des Dokument Tag zu aktualisieren. So könnte zum Beispiel die Eingabe xml etwa wie folgt aussehen:

<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>

die resultierende xml sollte wie folgt aussehen:

<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>

, aber das einzige, was ich erhalte, ist:

<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>

Nun, vielleicht für ein oder zwei von Ihnen ist es vielleicht nicht so große Sache sein, aber ich habe die Einschränkung, dass das Ausgabedokument Eins-zu-eins mit Ausnahme der gewünschten Änderungen (Namespace ändert das gleiche wie das Eingabedokument aussehen sollte und Löschung).

Meine XSLT sieht wie folgt aus:

<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>

Kann jemand bitte helfen? Namespaces sind heikel: (

P. S .: Wer meinen Eintrag bearbeitet: Danke:)

War es hilfreich?

Lösung

Sie können mit dem Namespace-Attribute des Namespace auf das Ausgangselement gesetzt:

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

Beachten Sie, dass der Namespace eine URI sein muss, und obwohl ich erwarte, dass das wissen Sie, es ist wahrscheinlich eine gute Idee, URIs in Ihrem Beispiel zu verwenden.

Hier ist ein Link zu dem ausgezeichneten ZVON Tutorial, die Beispielen gearbeitet hat: http://www.zvon.org/xxl/XSLTreference/Output/xslt_element_namespace. html

Ich bin damit einverstanden, dass Namespaces heikel ist. Wie Sie das Präfix wissen, ist semantisch irrelevant, aber viele Systeme ermöglichen es Ihnen Ihren Präfix aus ästhetischen Gründen zu wählen. Schauen Sie auch in Saxon ( http://saxon.sourceforge.net/ )

Bearbeiten Ich denke, dass Sie Ihre Antwort finden Sie hier: XSLT Root-Tag-Namespace statt Element Namespace-Attribut

Andere Tipps

<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>

Ausgabe:

<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>

Es sucht für jedes Element im Namensraum mit dem Präfix a und ersetzt sie mit einem Elemente mit dem gleichen Namen von Namespace http://example.com/B. Alle Attribute werden kopiert ‚wie besehen‘ und dann werden alle Kinder ausgewertet.

Fügen Sie Ihre individuelle Verarbeitung in oder um, dass je nach Bedarf.

Sind Sie Ant XSLT Aufgabe mit Ihrer Transformation zu tun?

Wenn die Antwort ja ist, können Sie aus dem Standard-XSLT-Engine wechseln möchten, die mit Sun JDK kommt 1.5+. Lesen Sie dieses .

Lesen Sie auch diesem Artikel über Namespaces in XSLT

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top