繁体   English   中英

为什么此XSLT无法生成预期的输出?

[英]Why does this XSLT not generate my expected output?

我正在尝试使用XSLT将XML转换为另一个XML。 这是我的XML

<?xml version="1.0" encoding = "iso-8859-1"?>
<Förskoleansökan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <?xml-stylesheet type="text/xsl" href="XSLTFile1.xslt"?>

  <Förskolenamn>Dalabergs förskola</Förskolenamn>

  <Barn>

    <Förnamn>Nils</Förnamn>
    <Efternamn>Petersson</Efternamn>
    <Personnummer>1008021245</Personnummer>


    <Syskon>
      <Personnummer>0005052464</Personnummer>
      <Förnamn>Johan</Förnamn>
      <Efternamn>Petersson</Efternamn>

    </Syskon>

    <Övrigt>

      <Allergier>Inga allergier</Allergier>
      <AnnatÖmmandeSkäl></AnnatÖmmandeSkäl>


    </Övrigt>

  </Barn>

  <Vårdnadshavare>

     <Vårdnadshavare1 personnummer="7806032356">
            <Förnamn>Mia</Förnamn>
            <Efternamn>Petersson</Efternamn>
    </Vårdnadshavare1>

    <Vårdnadshavare2 personnummer="7806089645">
            <Förnamn>Jörgen</Förnamn>
            <Efternamn>Petersson</Efternamn>
       
    </Vårdnadshavare2>

  </Vårdnadshavare>


</Förskoleansökan>

我正在尝试将该XML转换为此

<begaranominkomstuppgift>
    <person personnummer="7806032356">
      <fornamn>Mia</fornamn>
      <efternamn>Petersson</efternamn>
    </person>
    <person personnummer="7806089645">
      <fornamn>Jörgen</fornamn>
      <efternamn>Petersson</efternamn>
    </person>
</begaranominkomstuppgift>

这是我的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" indent="yes"/>
  <xsl:template match="/">
    <begaraninkomstuppgift>
      <xsl:for-each select="Förskoleansökan/Vårdnadshavare">
        <person>
          <xsl:attribute name="personummer">
            <xsl:value-of select="personnummer"/>
          </xsl:attribute>
          <fornamn>
            <xsl:value-of select="Vårdnadshavare/Förnamn" />
          </fornamn>
          <efternamn>
            <xsl:value-of select="Vårdnadshavare/Efternamn" />
          </efternamn>
        </person>
      </xsl:for-each>
    </begaraninkomstuppgift>
  </xsl:template>
</xsl:stylesheet>

转换不会发生,我的输出仍然是旧的XML。 这里似乎是什么问题?

XML当然是我的工作,并且基本上我对结构感到满意。 我设计了对我来说最简单的方法。 如果您能在这里帮助我,我将不胜感激。 我不希望您创建一个全新的样式表,只是指出当前样式表中的缺陷。

Stackoverflow的主要目标是教人们他们需要知道什么,而不是给他们他们想要的东西。

XSLT转换永远不会独立存在(例外:通用转换,例如身份转换),只有与特定的输入XML文档相关时,它才有意义。 输入就是您开始的内容。

有时,您会发现自己处在其他人(您的客户,外部提供商,老板希望通过这种方式等)定义输入的情况下,无论XML格式是否合理,您都必须应对。或不。

但这不是您的情况,您负责设计自己的输入文档,选择一个好的设计将大大简化创建XSLT样式表以处理输入的任务(您的最终目标)。

好吧,我是一个初学者,所以这对你们来说看起来真的很糟糕。 重要的是XML格式正确,并且不包含任何错误。

不,不是。 良好的格式首先是将任何东西称为XML的先决条件 ,但它并没有说明设计的有用性。


现在让我们看一下您的设计。 首先, <?xml-stylesheet处理指令应位于文件的开头,紧随XML声明之后:

接下来,查看Barn的内容:

<Barn>
    <Förnamn>Nils</Förnamn>
    <Efternamn>Petersson</Efternamn>
    <Personnummer>1008021245</Personnummer>
    <Syskon>
        <Personnummer>0005052464</Personnummer>
        <Förnamn>Johan</Förnamn>
        <Efternamn>Petersson</Efternamn>
    </Syskon>
    <Övrigt>
        <Allergier>Inga allergier</Allergier>
        <AnnatÖmmandeSkäl/>
    </Övrigt>
</Barn>

这三个相同的元素Syskon作为Barn直接子代出现,也出现在Syskon ,但是顺序不同,这没有意义。 元素的顺序在XML中很重要。

上面,人员编号表示为元素,但是在文档的后面,人员编号存储为属性,这肯定会引起混乱。

Vårdnadshavare内部,有子元素Vårdnadshavare1Vårdnadshavare2 绝对不能以这种方式设计元素名称,因为它会使自动处理变得复杂(因为每个元素名称都是唯一的),并且因为数字实际上是元素的位置 ,这是显而易见的。

相同的事物应具有相同的名称,没有数字。 如果您需要其中的数字,则可以使用如下属性

<Vårdnadshavare n="1">

但是,正如我所说,这几乎是多余的。

请注意 :在设计的许多方面,我无法评论,因为元素名称使用的语言我不懂。 因此,很难提出一种改进的XML设计。 如果您打算提出其他XSLT问题,则翻译内容可能会获得更好的帮助。

为什么它不起作用?

正在工作-只是没有按您期望的方式工作。

这样做的主要原因是您为每个Förskoleansökan/Vårdnadshavare创建一个人。 XML中只有一个Vårdnadshavare元素,因此只能创建一个人。

要获得所需的两个人,您需要为Vårdnadshavare每个子节点创建一个人。 您已将这些Vårdnadshavare1Vårdnadshavare2命名,这使得很难通过名称选择它们。 如果我们假设他们的独生子女 Vårdnadshavare ,我们可以这样做:

<xsl:for-each select="Förskoleansökan/Vårdnadshavare/*">
    <person>
    ...

下一个错误是您使用:

<xsl:value-of select="personnummer"/>

代替:

 <xsl:value-of select="@personnummer"/>

最后, FörnamnEfternamnVårdnadshavare1 / Vårdnadshavare2直接Vårdnadshavare2 -因此,像Vårdnadshavare/Förnamn这样的表达式不会选择任何内容。

尝试以下更正的样式表:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <begaraninkomstuppgift>
      <xsl:for-each select="Förskoleansökan/Vårdnadshavare/*">
        <person>
          <xsl:attribute name="personummer">
            <xsl:value-of select="@personnummer"/>
          </xsl:attribute>
          <fornamn>
            <xsl:value-of select="Förnamn" />
          </fornamn>
          <efternamn>
            <xsl:value-of select="Efternamn" />
          </efternamn>
        </person>
      </xsl:for-each>
    </begaraninkomstuppgift>
  </xsl:template>
</xsl:stylesheet>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM