Ich bin ein Anfänger in XML und im Moment arbeite ich daran, ein XML mit XSLT in ein anderes XML umzuwandeln. Allerdings kann ich nicht herausfinden, warum es im Moment nicht funktioniert. Ich würde es lieben, wenn Sie das Problem hier erklären könnten.

Hier ist meine XMLFile1.xml

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="XSLTFile1.xslt"?>

<School
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com XMLSchema1.xsd">


  <NameOfSchool>FCB</NameOfSchool>

  <Child>

    <FirstName>Sally</FirstName>
    <LastName>Johnson</LastName>
    <P-Number>1008021245</P-Number>


    <Sibling>
      <P-Number>0005052464</P-Number>
      <FirstName>Art</FirstName>
      <LastName>Vandelay</LastName>

    </Sibling>

    <Other>

      <Allergies>No</Allergies>
      <AMS>No</AMS>


    </Other>

  </Child>



  <Parent1>

    <FirstName>H.E</FirstName>
    <LastName>Pennypecker</LastName>
    <P-Number>7806032356</P-Number>
    <Adress>4 Yawkey Way Boston, Massachusetts 02215</Adress>


    <Contact>

      <Phone>
        <Work>0522375796</Work>
        <Home>0522597068</Home>
      </Phone>

    </Contact>


  </Parent1>


  <Parent2>

    <FirstName>Kel</FirstName>
    <LastName>Varnsen</LastName>
    <P-Number>7806089645</P-Number>
    <Adress>1 East 161st Street Bronx, New York City, New York 10451</Adress>

    <Contact>

      <Phone>
        <Work>0522596847</Work>
        <Home>0522597068</Home>
      </Phone>

    </Contact>

  </Parent2>


</School>

Und hier ist meine XSLTFile1.xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="Parent1">
      <BGI>
        <Parent1>
          <P-Number>
            <xsl:value-of select="P-Number"/>
          </P-Number>
          <FirstName>
            <xsl:value-of select="FirstName"/>
          </FirstName>
          <LastName>
            <xsl:value-of select="LastName"/>
          </LastName>
        </Parent1>

      </BGI>
  </xsl:template>

  <xsl:template match="Parent2">
    <BGI>
      <Parent2>
        <P-Number>
          <xsl:value-of select="P-Number"/>
        </P-Number>
        <FirstName>
          <xsl:value-of select="FirstName"/>
        </FirstName>
        <LastName>
          <xsl:value-of select="LastName"/>
        </LastName>
      </Parent2>

    </BGI>
  </xsl:template>
</xsl:stylesheet>

Was ich möchte, ist, dass das neue XML-Dokument so aussieht:

<BGI>
  <Parent1>
    <P-Number>7806032356</P-Number>
    <FirstName>H.E</FirstName>
    <LastName>Pennypecker</LastName>
  <Parent1>

   <Parent2>
    <P-Number>7806089645</P-Number>
    <FirstName>Kel</FirstName>
    <LastName>Varnsen</LastName>
  <Parent2>
</BGI>
0
Rengaw 26 Dez. 2015 im 02:13

2 Antworten

Beste Antwort

Das erwartete Ergebnis kann mit dem folgenden Stylesheet erzielt werden:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://www.w3schools.com"
exclude-result-prefixes="ns1">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/ns1:School">
    <BGI>
        <xsl:apply-templates select="ns1:Parent1 | ns1:Parent2"/>
    </BGI>
</xsl:template>

<xsl:template match="ns1:Parent1 | ns1:Parent2">
    <xsl:element name='{local-name()}'>
        <xsl:apply-templates select="ns1:P-Number | ns1:FirstName | ns1:LastName"/>
    </xsl:element>
</xsl:template>

<xsl:template match="*">
    <xsl:element name='{local-name()}'>
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

Hinweis :

  1. Die Verwendung eines Präfixes zum Adressieren von Elementen im Quell-XML;
  2. Die Verwendung von xsl:element anstelle von xsl:copy zum Neuerstellen des "kopierte" Elemente im No-Namespace.
0
michael.hor257k 26 Dez. 2015 im 15:00

Sie schreiben nur in die Vorlagen <Parent1> und <Parent2>. Sie schreiben nicht in die Vorlagen <NameOfSchool> oder <Child> (die anderen Geschwister). Infolgedessen werden sie in der Ausgabe exakt gleich gerendert. Wenn Sie die letzteren Knoten entfernen möchten, schreiben Sie eine leere Vorlage, wie unten gezeigt.

Insbesondere kopiert die Identitätstransformation den gesamten Inhalt wie er ist und die leeren Vorlagen entfernen die Knoten, auf die verwiesen wird. Ich verwende das Pipe-Trennzeichen (|), um die Vereinigung der referenzierten Mengen anzuwenden. Der Namespace doc wird in XSLT deklariert, ein rein willkürlich gewählter Name, da Sie im XML-Dokument im Eröffnungs-Tag <School> einen nicht deklarierten Namespace haben.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                              xmlns:doc="http://www.w3schools.com"
                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                              xsi:schemaLocation="http://www.w3schools.com XMLSchema1.xsd"
                              exclude-result-prefixes="msxsl doc">
<xsl:output method="html" indent="yes"/>
<xsl:strip-space elements="*"/>

  <!-- Identity Transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- Empty template to remove nodes -->
  <xsl:template match="doc:NameOfSchool|doc:Child"/>

  <!-- Rewrite of needed nodes, doc/value-of/local-name all used to handle namespace -->
  <xsl:template match="doc:Parent1|doc:Parent2">
    <BGI>
      <xsl:element name='{local-name()}'>
        <P-Number><xsl:value-of select="doc:P-Number"/></P-Number>
        <FirstName><xsl:value-of select="doc:FirstName"/></FirstName>
        <LastName><xsl:value-of select="doc:LastName"/></LastName>
      </xsl:element>
    </BGI>
  </xsl:template>  

</xsl:stylesheet>

Übrigens, wenn Sie diese XML in einem Browser anzeigen, wird das Stylesheet angewendet, aber der ursprüngliche XML-Inhalt wird in der Seitenquelle angezeigt. Und da das endgültig ausgegebene XML kein HTML-Markup (<div>, <table>, <p>, <span>) enthält, werden nur Werte angezeigt.

0
Parfait 26 Dez. 2015 im 03:51