【问题标题】:XML to XML transformation with XSL使用 XSL 进行 XML 到 XML 的转换
【发布时间】:2016-04-15 04:17:33
【问题描述】:

我正在尝试将一个 XML 文件转换为另一个 XML 文件。这是我的输入文件:

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

  <forskola_namn>Kopparholmen</forskola_namn>

  <barn persunnummer="200505051111">
    <namn>Niklas Niklasson</namn>
    <syskon_pnr>200606061111</syskon_pnr>
    <allergi>Laktos</allergi>
  </barn>

  <vardnadshavare personnummer="198606061111">
    <fornamn>Magnus</fornamn>
    <efternamn>Niklasson</efternamn>
    <adress>
      <hem>Magnusgatan 10</hem>
      <jobb>Jobbgatan 1</jobb>
    </adress>
    <telefon>
      <hem>0520-12345</hem>
      <mobil>077-731731</mobil>
    </telefon>
  </vardnadshavare>

  <vardnadshavare personnummer="198605051111">
    <fornamn>Hanna</fornamn>
    <efternamn>Niklasson</efternamn>
    <adress>
      <hem>Magnusgatan 10</hem>
      <jobb>Jobbgatan 5</jobb>
    </adress>
    <telefon>
      <hem></hem>
      <mobil>077-721721</mobil>
    </telefon>
  </vardnadshavare>

  <annat_ommande_skal>Inget</annat_ommande_skal>

</Ansokan>

这是我尝试做的转换后的 XML:

<begaranominkomstuppgift>
   <person personnummer="">
      <fornamn></fornamn>
      <efternamn></efternamn>
   </person>
   <person personnummer="">
      <fornamn></fornamn>
      <efternamn></efternamn>
   </person>
</begaranominkomstuppgift>

我想要做的是,创建一个新的根为&lt;begaranominkomstuppgift&gt;,并使用属性将 2 vardnadshavare 作为&lt;person&gt;,然后只使用 vardnadshavare &lt;fornamn&gt;&lt;efternamn&gt;

这是我的 XSL 文件:

<?xml version="1.0" encoding="utf-8"?>

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

        <xsl:output method="xml" version="1.0" indent="yes" />

        <xsl:template match="/">
            <begaranominkomstuppgift>
                <xsl:apply-templates select="Ansokan/vardnadshavare" />
            </begaranominkomstuppgift>
        </xsl:template>

        <xsl:template match="Ansokan/vardnadshavare">
            <xsl:element name="person" personnummer="{@personnummer}">
                <xsl:element name="fornamn">
                    <xsl:value‐of select="fornamn" />
                </xsl:element>
                <xsl:element name="efternamn">
                    <xsl:value‐of select="efternamn" />
                </xsl:element>
        </xsl:template>
    </xsl:stylesheet>

XSL 文件可能没有获取正确的信息。而且改造后我看不到标签。我的意思是即使我选择了正确的信息,它也不会在转换后显示 xml 标签。我哪里错了?

【问题讨论】:

  • 您可能希望为您的帖子选择一个更具体的标题。 “使用 XSL 进行 XML 到 XML 转换”几乎是通用的,它描述了该站点上几乎所有 XSLT 问题。

标签: xml xslt xslt-1.0


【解决方案1】:

认为你想做的是以下。您的解决方案与我的解决方案之间最显着的区别:

  • 如果你知道一个元素的名字是什么,就不需要&lt;xsl:element name="person"&gt;,只需使用&lt;person&gt;
  • 在新的person里面,我用copy-of复制两个元素

XSLT 样式表

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*"/>

    <xsl:template match="/Ansokan">
        <begaranominkomstuppgift>
            <xsl:apply-templates/>
        </begaranominkomstuppgift>
    </xsl:template>

    <xsl:template match="vardnadshavare">
        <person personnummer="{@personnummer}">
            <xsl:copy-of select="fornamn | efternamn"/>
        </person>
    </xsl:template>

    <xsl:template match="text()"/>

</xsl:transform>

XML 输出

<?xml version="1.0" encoding="UTF-8"?>
<begaranominkomstuppgift>
   <person personnummer="198606061111">
      <fornamn>Magnus</fornamn>
      <efternamn>Niklasson</efternamn>
   </person>
   <person personnummer="198605051111">
      <fornamn>Hanna</fornamn>
      <efternamn>Niklasson</efternamn>
   </person>
</begaranominkomstuppgift>

在线尝试此解决方案here


XSL 文件可能没有获取正确的信息。而且改造后我看不到标签。我的意思是即使我选择了正确的信息,它也不会在转换后显示 xml 标签。我哪里做错了?

原始 XSLT 代码的问题在于 1) xsl:element 指令之一未关闭,以及 2) personnummer 不能是 xsl:element 的属性。你必须使用xsl:attribute:

<xsl:element name="person">
  <xsl:attribute name="personnummer" select="@personnummer"/>

此外,您在valueof 之间使用的连字符在某种程度上无法被我的处理器识别。

但通常,如果转换“不显示标签”,那是因为 命名空间。很有可能您的输入文档有一个您没有向我们展示的默认命名空间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2013-06-14
    • 2011-12-31
    • 2012-08-12
    相关资源
    最近更新 更多