首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT:使用xslt工作表将xml转换为符合dtd的xml文件

XSLT:使用xslt工作表将xml转换为符合dtd的xml文件
EN

Stack Overflow用户
提问于 2013-11-25 04:39:12
回答 1查看 143关注 0票数 0

我必须将xml文件转换为符合dtd的xml文件...因此,我必须编写一个xslt表...这是xml文件:

代码语言:javascript
复制
<?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表单:

代码语言:javascript
复制
<?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)>

我现在要做的是:

代码语言:javascript
复制
<?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>

有谁知道如何实现这一点吗?

EN

回答 1

Stack Overflow用户

发布于 2013-11-25 08:09:41

下面的XSLT执行所需的转换:

代码语言:javascript
复制
<?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>

要生成此输出,应与上面提到的DTD保持一致

代码语言:javascript
复制
<?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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20180681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档