2013-04-09 96 views
0

我有以下XMLXSLT樣式表複式

<TopLevel> 
    <data m="R263"> 
    <s ut="263firstrecord" lt="2013-02-16T09:21:40.393" /> 
    <s ut="263secondrecord" lt="2013-02-16T09:21:40.393" /> 
    </data> 
    <data m="R262"> 
    <s ut="262firstrecord" lt="2013-02-16T09:21:40.393" /> 
    <s ut="262secondrecord" lt="2013-02-16T09:21:40.393" /> 
    </data> 
</TopLevel> 

我有一些XSLT,做呼叫模板,但它不是正確itterating。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="data"> 
<xsl:value-of select="@m" /> 
<xsl:variable name="vYourName" select="@m"/> 
    <xsl:choose> 
     <xsl:when test="@m='R262'"> 
      <xsl:call-template name="R262"/> 
     </xsl:when> 
    </xsl:choose> 
    <xsl:choose> 
     <xsl:when test="@m='R263'"> 
      <xsl:call-template name="R263"/> 
     </xsl:when> 
    </xsl:choose> 
</xsl:template> 

<xsl:template name="R262"> 
         <xsl:for-each select="/TopLevel/data/s"> 
             Column1=<xsl:value-of select="@ut" /> 
        Column2=<xsl:value-of select="@lt" /> 
      </xsl:for-each> 
</xsl:template> 

<xsl:template name="R263"> 
         <xsl:for-each select="/TopLevel/data/s"> 
             Column1=<xsl:value-of select="@ut" /> 
        Column2=<xsl:value-of select="@lt" /> 
      </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

這給了我8記錄在4 (<s> level)記錄。我知道這與我的迭代有關......但我不知道如何解決這個問題。

我也知道了應用的樣式表,但我不能揭開這種神祕要麼...如果有人可以幫助我XSLT只會在<data>級別來處理一切從<TopLevel><\TopLevel>檢查m的值並在每個<s>記錄的<s>級別上應用樣式表,我將無法相信。

+0

你能提供預期的結果XML嗎?這將幫助我們瞭解您的原始XSLT是否可以修改以實現您想要的功能。 – ABach 2013-04-09 19:03:46

+0

我實際上只是要從每個元素中獲取數值並返回一個插入語句......我知道我可以將它們作爲數據集返回......不知道......這是下一個問題......底線對於上面的例子,我期望得到4條記錄263firstrecord,263secondrecord,262firstrecord,262secondrecord),每列有2列(column1和column2)。 非常感謝您的回覆,我非常喜歡這個xslt。 – user2263069 2013-04-09 20:33:17

+0

您好,請參閱我的解決方案以應用模板邏輯。問候,彼得 – Peter 2013-04-10 08:18:46

回答

1

我不知道你想生產什麼輸出,但我懷疑你想要

<xsl:for-each select="/TopLevel/data/s"> 

通過

<xsl:for-each select="s"> 

要替換,你只想要處理的「S」您正在處理的「數據」中的元素,而不是選擇整個文檔中的所有「s」元素。

爲什麼不使用apply-templates?

<xsl:template match="data"> 
    ... 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="s[../@m='R262']"> 
    ... 
</xsl:template> 

<xsl:template match="s[../@m='R263']"> 
    ... 
</xsl:template> 
+0

這正是我想要做的,但我無法得到xsl驗證...繼續得到''和''xsl的行。請告知...並再次感謝。 – user2263069 2013-04-10 01:45:35

+0

我只是需要添加另一個「在所提到的行末...這工作非常感謝! – user2263069 2013-04-10 02:20:00

+0

對不起,我已經更正了建議的代碼中的引號。 – 2013-04-10 08:35:41

0

如果你想使用match templateapply-templates你可以做,讓你也文本輸出,就像你的樣式做以下。所以這個XSLT應用到原始源XML:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="data"> 
    <xsl:value-of select="@m"/> 
    <xsl:apply-templates select="s"/>  
</xsl:template> 

<xsl:template match="s"> 
    Column1=<xsl:value-of select="@ut"/> 
    Column2=<xsl:value-of select="@lt"/> 
</xsl:template> 

</xsl:stylesheet> 

給你這樣的輸出:

<?xml version="1.0" encoding="UTF-8"?> 
R263 
    Column1=263firstrecord 
    Column2=2013-02-16T09:21:40.393 
    Column1=263secondrecord 
    Column2=2013-02-16T09:21:40.393 
R262 
    Column1=262firstrecord 
    Column2=2013-02-16T09:21:40.393 
    Column1=262secondrecord 
    Column2=2013-02-16T09:21:40.393 

你基本上只匹配在s並給出了屬性「UT」和「LT」。你也可以輸出看起來更好的XML。

使用此XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
    <root> 
     <xsl:apply-templates/> 
    </root> 
</xsl:template> 

<xsl:template match="data"> 
    <list> 
     <xsl:apply-templates select="s"/> 
    </list> 
</xsl:template> 

<xsl:template match="s"> 
    <xsl:element name="record"> 
     <xsl:attribute name="m"> 
      <xsl:value-of select="parent::data/@m"/> 
     </xsl:attribute> 
     <item>Column1=<xsl:value-of select="@ut"/></item> 
     <item>Column2=<xsl:value-of select="@lt"/></item> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

會給你這個漂亮的XML輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<list> 
    <record m="R263"> 
     <item>Column1=263firstrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
    <record m="R263"> 
     <item>Column1=263secondrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
</list> 
<list> 
    <record m="R262"> 
     <item>Column1=262firstrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
    <record m="R262"> 
     <item>Column1=262secondrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
</list> 

你必須去適應原來的XSLT一點點地得到一個不錯的XML結構。當匹配s時,您「爬」到元素data以獲取R-numbers作爲屬性值。

模板匹配root您需要一個適當的XML根元素。 <list>你也可以擺脫掉,那麼你有<record>作爲<root>的孩子。

我希望這是你的預期,並嘗試與它一起玩耍!

最好的問候,彼得