为什么这个XSLT不会产生我预期的输出?

时间:2016-01-11 16:13:24

标签: xml xslt

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

filler

我试图将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>

这是我的XSL

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

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

2 个答案:

答案 0 :(得分:1)

  

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>

三个相同的元素出现在Barn的直接子元素和Syskon内部,但顺序不同,这没有意义。元素的顺序在XML中很重要。

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

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

相同的东西应该具有相同的名称,没有数字。如果你需要它中的数字,你可以有一个像

这样的属性
<Vårdnadshavare n="1">
但是,正如我所说,这几乎肯定是多余的。

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

答案 1 :(得分:1)

  

为什么不起作用?

正在工作 - 它只是没有按照您的预期工作。

这样做的主要原因是您为每个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å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>