2012-07-18 81 views
-1

我試圖讓從下方使用XSLT的XML的ageCode屬性,把<Adults>3</Adults>如果ageCode = 10或<Children>0</Children>如果`ageCode = 8.這是我的示例XML:XML不會使用XSLT進行轉換嗎?

<Root> 
    <Reservations> 
     <Reservation> 
      <Rooms> 
       <Room> 
        <Guests> 
         <Guest ageCode="10" count="3" /> 
         <Guest ageCode="8" count="0" /> 
        </Guests> 
       </Room> 
      </Rooms> 
     </Reservation> 
    </Reservations> 
</Root> 

我試圖將其變換分析到:

<Reservation> 
    <Rooms> 
     <Room> 
      <Adults>3</Adults> 
      <Children>0</Children> 
     </Room> 
    </Rooms> 
</Reservation> 

與follwing XSLT,但我不能讓它工作(我是完全新的XSLT):

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:template match="/"> 
<xsl:element name="Reservation"> 
    <xsl:apply-templates /> 
</xsl:element> 
</xsl:template> 
<xsl:template match="Root/Reservations/Reservation/Rooms/Room/Guests"> 
<xsl:for-each select="Guest"> 
    <xsl:if test="@ageCode = '10'"> 
    <xsl:element name="Adults"> 
     <xsl:value-of select="@count"/> 
    </xsl:element> 
    </xsl:if> 
    <xsl:if test="@ageCode = '8'"> 
    <xsl:element name="Children"> 
     <xsl:value-of select="@count"/> 
    </xsl:element> 
    </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 
    </xsl:stylesheet> 

XSLT是如何工作的?通過這個我的意思是它應用模板從頂部到底部?我問,因爲你說我需要3個模板,每個模板都應用了一個新的轉換。

第一個和第二個模板實際上做了什麼?有沒有辦法在第一次應用後顯示XML,然後是第二次?我在這裏正確理解XSLT嗎?

你是什麼意思的應用更深的模板?

如果我必須創建許多XSLT,像MapForce這樣的工具會有用嗎?

+0

誰低估,謹慎解釋? – Xaisoft 2012-07-18 19:58:31

回答

2

您需要3個模板:一個丟棄前兩個元素,一個匹配所有內容,只輸出自己和遞歸,另一個去做你的客人 - >成年人轉型。

第一個是

<xsl:template match="Root|Reservations"> 
    <xsl:apply-templates/> 
</xsl:template> 

它輸出空,應用於更深的模板。

第二是

<xsl:template match="*"> 
    <xsl:element name="{name(.)}"> 
    <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

它輸出本身(即,與目前的名稱的元素),並適用於更深的模板。

第三是你有什麼,而只是匹配「客人」,而不是完整的路徑:

<xsl:template match="Guests"> 
<xsl:for-each select="Guest"> 
    <xsl:if test="@ageCode = '10'"> 
    <Adults> 
     <xsl:value-of select="@count"/> 
    </Adults> 
    </xsl:if> 
    <xsl:if test="@ageCode = '8'"> 
    <Children> 
     <xsl:value-of select="@count"/> 
    </Children> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

BTW,你不需要使用xsl:element以恆定的名稱,只是用文字。

+0

感謝您的指點。由於我是新手,我有一些問題。我會更新我的帖子。 – Xaisoft 2012-07-18 19:40:20

+0

工作很好。現在我只需要弄清楚輸出如何與輸入真正不同時如何實現。這裏的節點名稱相同。 – Xaisoft 2012-07-18 20:08:18