簡體   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