2013-11-24 155 views
0

我必須將xml文件轉換爲符合dtd的xml文件...因此我必須編寫一個xslt頁... 這是xml文件:XSLT:將xml轉換爲帶有xslt頁的dtd conform xml文件

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> 
<!DOCTYPE autoren SYSTEM "autoren.dtd"> 
<autoren> 
    <autor> 
     <nachname>Prudhomme</nachname> 
     <vorname>Sully</vorname> 
     <nobelpreis>1901</nobelpreis> 
     <sprache>französisch</sprache> 
     <buch> 
      <titel>t1888</titel> 
      <erscheinungsjahr>1888</erscheinungsjahr> 
     </buch> 
    </autor> 

    <autor> 
     <nachname>Hauptmann</nachname> 
     <vorname>Gerhard</vorname> 
     <nobelpreis>1912</nobelpreis> 
     <sprache>deutsch</sprache> 
     <buch> 
      <titel>t1900</titel> 
      <erscheinungsjahr>1900</erscheinungsjahr> 
     </buch> 
     <buch> 
      <titel>t1901</titel> 
      <erscheinungsjahr>1901</erscheinungsjahr> 
     </buch> 
    </autor> 

    <autor> 
     <nachname>France</nachname> 
     <vorname>Anatol</vorname> 
     <nobelpreis>1921</nobelpreis> 
     <sprache>französisch</sprache> 
     <buch> 
      <titel>t1900</titel> 
      <erscheinungsjahr>1900</erscheinungsjahr> 
     </buch> 
    </autor> 

    <autor> 
     <nachname>Lagerlöf</nachname> 
     <vorname>Selma</vorname> 
     <nobelpreis>1909</nobelpreis> 
     <sprache>schwedisch</sprache> 
     <buch> 
      <titel>t1900</titel> 
      <erscheinungsjahr>1900</erscheinungsjahr> 
     </buch> 
    </autor> 

    <autor> 
     <nachname>Hemingway</nachname> 
     <vorname>Ernest</vorname> 
     <nobelpreis>1954</nobelpreis> 
     <sprache>englisch</sprache> 
     <buch> 
      <titel>t1965</titel> 
      <erscheinungsjahr>1965</erscheinungsjahr> 
     </buch> 
     <buch> 
      <titel>t1951</titel> 
      <erscheinungsjahr>1951</erscheinungsjahr> 
     </buch> 
    </autor> 

    <autor> 
     <nachname>Cornwell</nachname> 
     <vorname>Patricia</vorname> 
     <sprache>englisch</sprache> 
     <buch> 
      <titel>From Potter's Field</titel> 
      <erscheinungsjahr>1995</erscheinungsjahr> 
     </buch> 
     <buch> 
      <titel>t1995</titel> 
      <erscheinungsjahr>1995</erscheinungsjahr> 
     </buch> 
    </autor> 

    <autor> 
     <nachname>Böll</nachname> 
     <vorname>Heinrich</vorname> 
     <nobelpreis>1972</nobelpreis> 
     <sprache>deutsch</sprache> 
     <buch> 
      <titel>t1969</titel> 
      <erscheinungsjahr>1969</erscheinungsjahr> 
     </buch> 
     <buch> 
      <titel>t1965</titel> 
      <erscheinungsjahr>1965</erscheinungsjahr> 
     </buch> 
    </autor> 

    <autor> 
     <nachname>Gide</nachname> 
     <vorname>André</vorname> 
     <nobelpreis>1947</nobelpreis> 
     <sprache>französisch</sprache> 
     <buch> 
      <titel>t1945</titel> 
      <erscheinungsjahr>1945</erscheinungsjahr> 
     </buch> 
    </autor> 

    <autor> 
     <nachname>Mann</nachname> 
     <vorname>Thomas</vorname> 
     <nobelpreis>1929</nobelpreis> 
     <sprache>deutsch</sprache> 
     <buch> 
      <titel>t1930</titel> 
      <erscheinungsjahr>1930</erscheinungsjahr> 
     </buch> 
     <buch> 
      <titel>t1910</titel> 
      <erscheinungsjahr>1910</erscheinungsjahr> 
     </buch> 
    </autor> 

    <autor> 
     <nachname>Mann</nachname> 
     <vorname>Heinrich</vorname> 
     <sprache>deutsch</sprache> 
     <buch> 
      <titel>t1920</titel> 
      <erscheinungsjahr>1920</erscheinungsjahr> 
     </buch> 
    </autor> 

    <autor> 
     <nachname>Faulkner</nachname> 
     <vorname>William</vorname> 
     <nobelpreis>1949</nobelpreis> 
     <sprache>englisch</sprache> 
     <buch> 
      <titel>t1930</titel> 
      <erscheinungsjahr>1930</erscheinungsjahr> 
     </buch> 
     <buch> 
      <titel>t1932</titel> 
      <erscheinungsjahr>1932</erscheinungsjahr> 
     </buch> 
    </autor> 

</autoren> 

這是我的.dtd形式:

<?xml version="1.0" encoding="iso-8859-1" ?> 
<!ELEMENT bücher (buch*)> 

<!ELEMENT buch (titel, erscheinungsjahr, autor)> 
<!ATTLIST buch sprache CDATA #REQUIRED> 

<!ELEMENT autor (nachname, vorname)> 
<!ATTLIST autor nobelpreis CDATA #IMPLIED> 

<!ELEMENT vorname (#PCDATA)> 
<!ELEMENT nachname (#PCDATA)> 
<!ELEMENT titel (#PCDATA)> 
<!ELEMENT erscheinungsjahr (#PCDATA)> 
<!ELEMENT nobelpreis (#PCDATA)> 
<!ELEMENT sprache (#PCDATA)> 

我做什麼現在:

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output encoding="ISO-8859-1" indent="yes" method="xml" /> 


    <xsl:template match="autoren">  
     <bücher> 
      <xsl:apply-templates select="autor">     
       <xsl:sort select="erscheinungsjahr" order="ascending" data-type="number"/> 
       <xsl:sort select="nachname"/> 
      </xsl:apply-templates> 
     </bücher> 
    </xsl:template> 

    <xsl:template match="autor"> 
     <buch> 
     <Name> 
      <xsl:value-of select="nachname"/> 
     </Name> 
     <Vorname> 
      <xsl:value-of select="vorname"/> 
     </Vorname> 
      <JahrNobelpreis> 
       <xsl:apply-templates select="nobelpreis" /> 
      </JahrNobelpreis> 
     </buch> 
    </xsl:template> 


</xsl:stylesheet> 

^h作爲任何人一個想法如何實現這一點?

+0

提到的DTD參見下面我的溶液。不過,這是一個奇怪的目標DTD。爲什麼要在一種情況下使一年的屬性和在另一種情況下的一個標籤?實際上,自從'(發佈日期)只能發生一次,但作者可能在不同年份會有幾次諾貝爾獎可能會使用標籤時,情況會更好。 –

+0

這是你期待的輸出嗎? –

+0

對我的解決方案有何反饋? –

回答

0

下面的XSLT確實所需的轉換:

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output encoding="ISO-8859-1" indent="yes" method="xml" /> 

    <xsl:template match="autoren">  
    <bücher> 
     <xsl:apply-templates select="autor/buch"> 
     <xsl:sort select="erscheinungsjahr" order="ascending" data-type="number"/> 
     <xsl:sort select="../nachname"/> 
     </xsl:apply-templates> 
    </bücher> 
    </xsl:template> 

    <xsl:template match="buch"> 
    <buch> 
     <xsl:attribute name="sprache"> 
     <xsl:value-of select="../sprache"/> 
     </xsl:attribute> 
     <titel><xsl:value-of select="titel"></xsl:value-of></titel> 
     <erscheinungsjahr><xsl:value-of select="erscheinungsjahr"></xsl:value-of></erscheinungsjahr> 
     <autor> 
     <xsl:attribute name="nobelpreis"> 
      <xsl:value-of select="../nobelpreis"/> 
     </xsl:attribute> 
     <nachname><xsl:value-of select="../nachname"/></nachname> 
     <vorname><xsl:value-of select="../vorname"/></vorname> 
     </autor> 
    </buch> 
    </xsl:template> 

</xsl:stylesheet> 

,以產生該輸出應是在對準上述

<?xml version="1.0" encoding="ISO-8859-1"?> 
<bücher> 
    <buch sprache="französisch"> 
    <titel>t1888</titel> 
    <erscheinungsjahr>1888</erscheinungsjahr> 
    <autor nobelpreis="1901"> 
     <nachname>Prudhomme</nachname> 
     <vorname>Sully</vorname> 
    </autor> 
    </buch> 
    <buch sprache="französisch"> 
    <titel>t1900</titel> 
    <erscheinungsjahr>1900</erscheinungsjahr> 
    <autor nobelpreis="1921"> 
     <nachname>France</nachname> 
     <vorname>Anatol</vorname> 
    </autor> 
    </buch> 
    <buch sprache="deutsch"> 
    <titel>t1900</titel> 
    <erscheinungsjahr>1900</erscheinungsjahr> 
    <autor nobelpreis="1912"> 
     <nachname>Hauptmann</nachname> 
     <vorname>Gerhard</vorname> 
    </autor> 
    </buch> 
    <buch sprache="schwedisch"> 
    <titel>t1900</titel> 
    <erscheinungsjahr>1900</erscheinungsjahr> 
    <autor nobelpreis="1909"> 
     <nachname>Lagerlöf</nachname> 
     <vorname>Selma</vorname> 
    </autor> 
    </buch> 
    <buch sprache="deutsch"> 
    <titel>t1901</titel> 
    <erscheinungsjahr>1901</erscheinungsjahr> 
    <autor nobelpreis="1912"> 
     <nachname>Hauptmann</nachname> 
     <vorname>Gerhard</vorname> 
    </autor> 
    </buch> 
    <buch sprache="deutsch"> 
    <titel>t1910</titel> 
    <erscheinungsjahr>1910</erscheinungsjahr> 
    <autor nobelpreis="1929"> 
     <nachname>Mann</nachname> 
     <vorname>Thomas</vorname> 
    </autor> 
    </buch> 
    <buch sprache="deutsch"> 
    <titel>t1920</titel> 
    <erscheinungsjahr>1920</erscheinungsjahr> 
    <autor nobelpreis=""> 
     <nachname>Mann</nachname> 
     <vorname>Heinrich</vorname> 
    </autor> 
    </buch> 
    <buch sprache="englisch"> 
    <titel>t1930</titel> 
    <erscheinungsjahr>1930</erscheinungsjahr> 
    <autor nobelpreis="1949"> 
     <nachname>Faulkner</nachname> 
     <vorname>William</vorname> 
    </autor> 
    </buch> 
    <buch sprache="deutsch"> 
    <titel>t1930</titel> 
    <erscheinungsjahr>1930</erscheinungsjahr> 
    <autor nobelpreis="1929"> 
     <nachname>Mann</nachname> 
     <vorname>Thomas</vorname> 
    </autor> 
    </buch> 
    <buch sprache="englisch"> 
    <titel>t1932</titel> 
    <erscheinungsjahr>1932</erscheinungsjahr> 
    <autor nobelpreis="1949"> 
     <nachname>Faulkner</nachname> 
     <vorname>William</vorname> 
    </autor> 
    </buch> 
    <buch sprache="französisch"> 
    <titel>t1945</titel> 
    <erscheinungsjahr>1945</erscheinungsjahr> 
    <autor nobelpreis="1947"> 
     <nachname>Gide</nachname> 
     <vorname>André</vorname> 
    </autor> 
    </buch> 
    <buch sprache="englisch"> 
    <titel>t1951</titel> 
    <erscheinungsjahr>1951</erscheinungsjahr> 
    <autor nobelpreis="1954"> 
     <nachname>Hemingway</nachname> 
     <vorname>Ernest</vorname> 
    </autor> 
    </buch> 
    <buch sprache="deutsch"> 
    <titel>t1965</titel> 
    <erscheinungsjahr>1965</erscheinungsjahr> 
    <autor nobelpreis="1972"> 
     <nachname>Böll</nachname> 
     <vorname>Heinrich</vorname> 
    </autor> 
    </buch> 
    <buch sprache="englisch"> 
    <titel>t1965</titel> 
    <erscheinungsjahr>1965</erscheinungsjahr> 
    <autor nobelpreis="1954"> 
     <nachname>Hemingway</nachname> 
     <vorname>Ernest</vorname> 
    </autor> 
    </buch> 
    <buch sprache="deutsch"> 
    <titel>t1969</titel> 
    <erscheinungsjahr>1969</erscheinungsjahr> 
    <autor nobelpreis="1972"> 
     <nachname>Böll</nachname> 
     <vorname>Heinrich</vorname> 
    </autor> 
    </buch> 
    <buch sprache="englisch"> 
    <titel>From Potter's Field</titel> 
    <erscheinungsjahr>1995</erscheinungsjahr> 
    <autor nobelpreis=""> 
     <nachname>Cornwell</nachname> 
     <vorname>Patricia</vorname> 
    </autor> 
    </buch> 
    <buch sprache="englisch"> 
    <titel>t1995</titel> 
    <erscheinungsjahr>1995</erscheinungsjahr> 
    <autor nobelpreis=""> 
     <nachname>Cornwell</nachname> 
     <vorname>Patricia</vorname> 
    </autor> 
    </buch> 
</bücher> 
+0

@ user2774480:如果我的解決方案可行,您能否提供一些反饋?謝謝! –