2016-03-23 64 views
0

使用我的代碼,我們得到了一個不同的需求,即必須將多個輸入映射到單個無界元素。下面是給出的例子。XSLT將多個輸入轉換爲單個無界元素

有人可以幫助這個。

源系統XSD映射

<Errors> 
<error> 
<errorcode>code</errorcode> 
<errortype>type</errortype> 
<paramater1>error1</paramater1> 
<paramater2>error2</paramater2> 
<paramater3/>error3</paramater3> 
<paramater4/>error4</paramater4> 
<error> 
<Errors> 

哪裏像現在我必須將這些值映射到目標XSD這是格式像

<Errors> 
<error> 
<errorcode>code</errorcode> 
<errortype>type</errortype> 
<errorParameters> 
    <errorPara>error1</errorPara> 
    <errorPara>error2</errorPara> 
    <errorPara>error3</errorPara> 
    <errorPara>error4</errorPara> 
</errorParameters> 
</error> 
</Errors> 

這裏errorPara在本質上是一個無界它位於errorParameters元素中。

我想知道這是如何使用XSLT 1.0實現

+0

XSLT無法按模式/正則表達式選擇節點上。如果你有parameter1,parameter2,... parameterN unbounded ....除了errorcode,errortype和parameter *還有其他的錯誤標籤嗎? –

+0

@KenCheung - 感謝您的回覆。不,我們沒有任何兒童標籤,因爲自然界無界限fr錯誤。我們有使用數組或循環的任何inbuild函數..可以這樣做。 – kumarb

+0

@kumarb http://stackoverflow.com/help/someone-answers –

回答

0

好吧,只有當只有錯誤代碼,ERRORTYPE的孩子,parameterN錯誤

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <!--Suppress unmatched text--> 
    <xsl:template match="text()" /> 

    <xsl:template match="/"> 
    <Errors><error> 
     <errorcode><xsl:apply-templates select="Errors/error/errorcode"/></errorcode> 
     <errortype><xsl:apply-templates select="Errors/error/errortype"/></errortype> 
     <errorParameters> 
      <xsl:for-each select="Errors/error/*"> 
       <xsl:choose> 
        <xsl:when test="name() = 'errorcode'"></xsl:when> 
        <xsl:when test="name() = 'errortype'"></xsl:when> 
        <xsl:otherwise><errorPara><xsl:value-of select="normalize-space(.)"/></errorPara></xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 
     </errorParameters> 
    </error></Errors> 
    </xsl:template> 

    <xsl:template match="errorcode"> 
     <xsl:value-of select="normalize-space(.)"/> 
    </xsl:template> 

    <xsl:template match="errortype"> 
     <xsl:value-of select="normalize-space(.)"/> 
    </xsl:template> 
</xsl:stylesheet> 

我覺得對這個問題的數據XML已經一些錯字所以我改變他們:

<Errors> 
<error> 
<errorcode>code</errorcode> 
<errortype>type</errortype> 
<parameter1>error1</parameter1> 
<parameter2>error2</parameter2> 
<parameter3>error3</parameter3> 
<parameter4>error4</parameter4> 
</error> 
</Errors> 

那麼結果(Linux的:在xsltproc test.xslt data.xml中| xmllint --format - ):

<?xml version="1.0"?> 
<Errors> 
    <error> 
    <errorcode>code</errorcode> 
    <errortype>type</errortype> 
    <errorParameters> 
     <errorPara>error1</errorPara> 
     <errorPara>error2</errorPara> 
     <errorPara>error3</errorPara> 
     <errorPara>error4</errorPara> 
    </errorParameters> 
    </error> 
</Errors> 
+0

我試過這個選項,但沒有在我的情況下工作,因爲我們在代碼中有其他的commplex邏輯。我用虛擬XSD提出了問題陳述 – kumarb

0

這裏有一個(簡單)的方式來看待它:

XSLT 1.0

<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:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="error"> 
    <xsl:copy> 
     <xsl:copy-of select="errorcode | errortype"/> 
     <errorParameters> 
      <xsl:for-each select="*[starts-with(name(), 'paramater')]"> 
       <errorPara> 
        <xsl:value-of select="."/> 
       </errorPara> 
      </xsl:for-each> 
     </errorParameters> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

如果有錯誤,沒有其他子女,除了errorcodeerrortypeparameterN,你可以使用:

<xsl:for-each select="*[not(self::errorcode or self::errortype)]"> 
相關問題