2010-07-26 59 views
1

第一關你好XSL嵌套每個現在的位置問題

好了我的問題,我試圖建立一種開放源碼的購物車,它使用XML存儲和XSL樣式籃下

1,我的XML

<items> 
    <item> 
     <item-name>vlaue</item-name> 
     <item-number>vlaue</item-number> 
     <quantity>vlaue<quantity> 
     <option> 
      <on0>vlaue</on0> 
      <os0>vlaue</os0> 
      <on1>vlaue</on1> 
      <os1>vlaue</os1> 
     </option> 
    </item> 
</items> 

該XML將一個項目中創建2個選項 由於貝寶允許的7個選項theat一個最大將是我上菲格爾 確定我的XSL

<xsl:for-each select="item"> 
    <input type='hidden' name="item_name_{position()}" value="{item-name}"/> 
    <input type='hidden' name="item_number_{position()}" value="{item-description}"/> 
    <input type='hidden' name="amount_{position()}" value="{unit-price}"/> 
    <input type='hidden' name="quantity_{position()}" value="{@quantity}"/> 
    <xsl:for-each select="option">    
     <input type='hidden' name="on{position()}_(i need this to be item postion)" value="(i need this to be "on" with the option postion appened ie "on0")"/> 
     <input type='hidden' name="os{position()}_{i need this to be item postion}" value="(i need this to be "os" with the option postion appened ie "os0")"/> 
    </xsl:for-each> 
</xsl:for-each> 

所以我真的要問我能有現在的位置的值從外每個傳遞到內每個

如果任何人能幫助它會graet

預先感謝您

Tim Dodgson

+0

小的一點,但是您指的是{@quantity},當數量在XML中是一個元素,而不是一個屬性。 – Flynn1179 2010-07-26 12:27:04

+1

@timdodgson:處理輸入樣本時,您希望輸出什麼?我問你這個,因爲每個答案都是保持你的XSLT模板設計,這不是一個好的XSLT風格 – 2010-07-26 15:43:28

回答

1

我不是100%確定我完全理解XSLT是如何與您發佈的XML相關的。我認爲這將是有意義的編輯你的問題,所以你明確指出:

  • 什麼是輸入XML
  • 什麼是所需的輸出XML
  • 什麼是你與
  • 掙扎XSLT

(也許我應該問這個的評論,但目前已收集足夠的學分這麼做)

回答您的基本問題(從我的困惑抽象):你總是可以p通過變量分析這些位置信息。只需將外部for-each中的上下文項的位置分配給變量,然後在inner for-each中引用此變量。據我瞭解你的XSLT樣式表,我假設你正在尋找的東西是這樣的:

<xsl:for-each select="item"> 
    <xsl:variable name="itemPos" select="position()"/> 
    <input type='hidden' name="item_name_{position()}" value="{item-name}"/> 
    <input type='hidden' name="item_number_{position()}" value="{item-description}"/> 
    <input type='hidden' name="amount_{position()}" value="{unit-price}"/> 
    <input type='hidden' name="quantity_{position()}" value="{@quantity}"/> 
    <xsl:for-each select="option/*">    
     <input type='hidden' name="{name()}_{$itemPos}" value="{.}"/> 
    </xsl:for-each> 
</xsl:for-each> 

上下文項中的for-each被存儲在一個變量$ itemPos外的位置,它可以是進一步參考。

親切的問候,

羅恩

+0

謝謝你的回覆 1,輸入xml是上面陳述的內容 2,輸出內容是籃子準備好被髮送到PayPal 3,XSLT我是strugling如何從外部傳遞現在的位置值,每個到內每個 這transfoem從ASP腳本在服務器上被稱爲您的回覆 千恩萬謝 我會看看,如果我可以得到變量工作 也對你的答案我將如何設置值的值=「(我需要這是」操作系統「或」上「與選項位置上升,即」OS0「) 「 – 2010-07-26 12:12:18

+0

好的,我編輯過我的回答(因爲我忘記了最裏面的元素中的@value屬性)。另外,我想你會想要爲

+0

Ron非常感謝你,現在已經差不多了,我終於明白了你在問我什麼,希望lol的值需要等於xml名稱的內容,所以我如果只是手工編碼,我會寫value =「{on0} 「和value =」{os0}「從我的xml中獲取值,所以我需要類似value =」{on [postion()}「和value =」{os [postion()}「在開始 非常感謝你的時間和精力 – 2010-07-26 12:51:42

0

說實話,我會重新考慮你的XML的設計;通常不建議將數字索引作爲標記名稱的一部分,因爲這使得在xslt或xsd模式中使用起來更加困難。我建議的東西沿着線:

<option> 
     <on index="0">vlaue</on> 
     <os index="0">vlaue</os> 
     <on index="1">vlaue</on> 
     <os index="1">vlaue</os> 
    </option> 

然後,你可以簡單地採取從@index屬性的位置,你也可以做<foreach select="os">只有通過所有的os元素迭代,例如。

+0

ok非常感謝你,你的努力是偉大的我想到一個屬性,但不知道如果有一個簡單的xslt答案,你已經回答了我的問題,而不是你 – 2010-07-26 13:05:06

0

你的問題不太清楚,但我認爲你需要像這樣的樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="items"> 
     <form> 
      <xsl:apply-templates/> 
     </form> 
    </xsl:template> 
    <xsl:template match="item|option" priority="1"> 
     <xsl:param name="pos" select="position()"/> 
     <xsl:apply-templates select="*"> 
      <xsl:with-param name="pos" select="$pos"/> 
     </xsl:apply-templates> 
    </xsl:template> 
    <xsl:template match="item/*|option/*"> 
     <xsl:param name="pos"/> 
     <input type='hidden' name="{name()}_{$pos}" value="{.}"/> 
    </xsl:template> 
</xsl:stylesheet> 

有了這個正確的輸入:

<items> 
    <item> 
     <item-name>vlaue</item-name> 
     <item-number>vlaue</item-number> 
     <quantity>vlaue</quantity> 
     <option> 
      <on0>vlaue</on0> 
      <os0>vlaue</os0> 
      <on1>vlaue</on1> 
      <os1>vlaue</os1> 
     </option> 
    </item> 
</items> 

輸出:

<form> 
    <input type="hidden" name="item-name_1" value="vlaue" /> 
    <input type="hidden" name="item-number_1" value="vlaue" /> 
    <input type="hidden" name="quantity_1" value="vlaue" /> 
    <input type="hidden" name="on0_1" value="vlaue" /> 
    <input type="hidden" name="os0_1" value="vlaue" /> 
    <input type="hidden" name="on1_1" value="vlaue" /> 
    <input type="hidden" name="os1_1" value="vlaue" /> 
</form> 

:模式匹配允許重用。 @priority用於解決item/*option衝突而不依賴錯誤恢復。添加虛擬的form用於良好的輸出(它不是完全需要完整的樣式表)