我尝试使用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。这似乎是什么问题?
答案 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årdnadshavare1
和Vårdnadshavare2
。元素名称永远不应该以这种方式设计,因为它使自动处理变得复杂(因为每个元素名称都是唯一的),并且因为数字实际上是元素的位置,这是显而易见的。
相同的东西应该具有相同的名称,没有数字。如果你需要它中的数字,你可以有一个像
这样的属性<Vårdnadshavare n="1">
但是,正如我所说,这几乎肯定是多余的。
请注意:在设计的许多方面我都无法评论,因为元素名称是我不懂的语言。因此,很难提出改进的XML设计。如果您打算进一步询问XSLT问题,如果您翻译内容,可能会得到更好的帮助。
答案 1 :(得分:1)
为什么不起作用?
正在工作 - 它只是没有按照您的预期工作。
这样做的主要原因是您为每个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å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>