2016-04-25 51 views
0

我想變換分析下面的XML:XSLT:解析XML並重新構造XML?

<root> 
    <ParaList> 
    <Para name="p001" label="Continuous1" /> 
    <Para name="p002" label="Continuous5" /> 
    <Para name="p003" label="[Categorical3=1]" /> 
    <Para name="p004" label="[Categorical3=2]" /> 
    <Para name="p005" label="[Categorical3=3]" /> 
    </ParaList> 

    <ParaMatrix> 
    <PCell paraName="p001" coef="1.043"/> 
    <PCell paraName="p002" coef="0.841"/> 
    <PCell paraName="p003" coef="0.907"/> 
    <PCell paraName="p004" coef="-0.26"/> 
    <PCell paraName="p005" coef="5.333"/> 
    </ParaMatrix> 
</root> 

到一個新的XML:

<root> 
    <PMatrix> 
    <NumericCell paraName="Continuous1" coef="1.043"/> 
    <NumericCell paraName="Continuous5" coef="0.841"/> 
    <CategoricalCell value="1" paraName="Categorical3" coef="0.907"/> 
    <CategoricalCell value="2" paraName="Categorical3" coef="-0.26"/> 
    <CategoricalCell value="3" paraName="Categorical3" coef="5.333"/> 
    </PMatrix> 
</root> 

在原始XML中,有3個變量Continous1,Continuous5,Categorical3。連續1 &連續5是連續數值,分類3是3個可能值(1,2,3)的分類,它們被視爲3個獨立參數(p003,p004,p005)。每個參數都有一個係數。 可能有更多的變量,他們不遵循任何命名轉向。你只能說有些是絕對的,因爲label =「[categoricalVariableName = value]」。每個分類變量,如果它有M個可能的值,則生成M個參數。

我想解析原始的XML,得到係數(係數)直接映射到變量,而不是參數。如果它是一個連續變量,

<NumericCell paraName="Continuous1" coef="1.043"/> 

如果是分類變量,

<CategoricalCell value="1" paraName="Categorical3" coef="0.907"/> 
<CategoricalCell value="2" paraName="Categorical3" coef="-0.26"/> 
<CategoricalCell value="3" paraName="Categorical3" coef="5.333"/> 

我使用XSLT 1.0版本。非常感謝你的幫助。

+0

什麼版本的XSLT?你有什麼嘗試? –

+0

問題不明確。輸入中總會有5個'Para'元素? –

+0

我已經重寫了我原來的問題。我正在使用XSLT版本1.0。我沒有多少嘗試,因爲我不知道該怎麼做。 Th – Fischlein

回答

0

您的問題留下了很多猜測的空間,您的示例輸出甚至不是格式良好的,但讓我們假設您想要的是:對於每個ParaList/Para Z,按如下方式生成PMatrix的子項:如果Z/@標籤的形式爲pN,則生成一個等於Z/@標籤的@paraName,以及從相應PCell獲取的coef。如果Z/@標籤的形式爲[pN = M],則生成一個值爲= M,paraName = pN,coef如上所示。

這留下了很多未解決的情況,例如標籤與這些模式中的任何一個都不匹配。但是,這會給這樣的事情:

<xsl:key name="cell" match="ParaMatrix/PCell" use="@paraName"/> 

<xsl:template match="/"> 
    <root> 
    <PMatrix> 
    <xsl:apply-templates select="root/ParaList/Para"/> 
    </PMatrix> 
    </root> 
</xsl:template> 

<xsl:template match="Para[matches(@label, 'p[0-9]')"> 
    <NumericCell paraName="{@label}" coef="{key('cell', @name)/@coef}"/> 
</xsl:template> 

<xsl:template match="Para[matches(@label, '\[p[0-9]=[0-9]+\]')]"> 
    <CategoricalCell coef="{key('cell', @name)/@coef}"> 
    <xsl:analyze-string select="@label" regex="\[(p[0-9])=([0-9]+)\]"> 
    <xsl:matching-substring> 
    <xsl:attribute name="value" select="regex-group(2)"/> 
    <xsl:attribute name="paraName" select="regex-group(1)"/> 
    </xsl:matching-substring> 
    <xsl:non-matching-substring/> 
    </xsl:analyze-string> 
    </CategoricalCell> 
</xsl:template> 
+0

你好邁克爾,謝謝你的評論。我意識到我的問題在某些方面並不明確。所以我重寫了我的問題。變量的名稱(超出這些變量=>參數)不遵循任何命名約定。非常感謝您的專業知識。 – Fischlein

+0

然後,只需將我的示例中的正則表達式替換爲更寬泛的表達式,例如p [0-9]變爲[A-Za-z] [A-Za-z0-9] *。 –

+0

你好邁克爾,我試了你的代碼,但是得到了語法錯誤,「未知函數匹配」,這是因爲我使用的是xsl版本1.0嗎?能否請你幫我解決1.0的問題?非常感謝你 – Fischlein