[英]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årdnadshavare1
和Vårdnadshavare2
。 绝对不能以这种方式设计元素名称,因为它会使自动处理变得复杂(因为每个元素名称都是唯一的),并且因为数字实际上是元素的位置 ,这是显而易见的。
相同的事物应具有相同的名称,没有数字。 如果您需要其中的数字,则可以使用如下属性
<Vårdnadshavare n="1">
但是,正如我所说,这几乎是多余的。
请注意 :在设计的许多方面,我无法评论,因为元素名称使用的语言我不懂。 因此,很难提出一种改进的XML设计。 如果您打算提出其他XSLT问题,则翻译内容可能会获得更好的帮助。
为什么它不起作用?
它正在工作-只是没有按您期望的方式工作。
这样做的主要原因是您为每个Förskoleansökan/Vårdnadshavare
创建一个人。 XML中只有一个Vårdnadshavare
元素,因此只能创建一个人。
要获得所需的两个人,您需要为Vårdnadshavare
每个子节点创建一个人。 您已将这些Vårdnadshavare1
和Vårdnadshavare2
命名,这使得很难通过名称选择它们。 如果我们假设他们的独生子女 Vårdnadshavare
,我们可以这样做:
<xsl:for-each select="Förskoleansökan/Vårdnadshavare/*">
<person>
...
下一个错误是您使用:
<xsl:value-of select="personnummer"/>
代替:
<xsl:value-of select="@personnummer"/>
最后, Förnamn
和Efternamn
是Vå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.