[英]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.