2017-09-15 97 views
0
<MemoPad> 
     <ENTRYTYPE>ReviewFees</ENTRYTYPE> 
     <ENTRYDATETIME>2017-09-05</ENTRYDATETIME> 
     <USERID>admin</USERID> 
     <MEMOENTRY>Review fees test</MEMOENTRY> 
    </MemoPad> 
    <MemoPad> 
     <ENTRYTYPE>UnderwriterReview</ENTRYTYPE> 
     <ENTRYDATETIME>2017-04-12</ENTRYDATETIME> 
     <USERID>ADMIN</USERID> 
     <MEMOENTRY>Underwriter Rule</MEMOENTRY> 
    </MemoPad> 
    <MemoPad> 
      <ENTRYTYPE>UnderwriterReview</ENTRYTYPE> 
      <ENTRYDATETIME>2017-09-05</ENTRYDATETIME> 
      <USERID>admin</USERID> 
      <MEMOENTRY>month bank statement. </MEMOENTRY> 
    </MemoPad> 

我嘗試了大量寫入XSLT的上述部分,但無法破解它。我找的基本上是我想遍歷每個記事本項目,並在記事每個EntryType我想創建一個像使用XSLT代碼從xml創建XML

 <ReviewFeesType> 
      <ReviewFee>    
       <ENTRYDATETIME>2017-09-05</ENTRYDATETIME> 
       <USERID>admin</USERID> 
       <MEMOENTRY>Review fees test</MEMOENTRY> 
      </ReviewFee> 
     </ReviewFeesType> 

的XML,但現在對於入門類型的多個類型應如下創建。

 <UnderwriterReviewType> 
     <UnderwriterReview> 
      <ENTRYDATETIME>2017-04-12</ENTRYDATETIME> 
      <USERID>ADMIN</USERID> 
      <MEMOENTRY>Underwriter Rule</MEMOENTRY> 
     </UnderwriterReview> 
     <UnderwriterReview> 
      <ENTRYDATETIME>2017-09-05</ENTRYDATETIME> 
      <USERID>admin</USERID> 
      <MEMOENTRY>month bank statement. </MEMOENTRY> 
      </UnderwriterReview> 
    </UnderwriterReviewType> 

如何爲此編寫XSLT? 請幫忙。

我已經試過是

<MemoPads> 
     <xsl:for-each select="MemoPad">    
     <xsl:element name="{ENTRYTYPE}"> 
      <ENTRYDATETIME> 
      <xsl:value-of select="ENTRYDATETIME"/> 
      </ENTRYDATETIME> 
      <USERID> 
      <xsl:value-of select="USERID"/> 
      </USERID> 
      <MEMOENTRY> 
      <xsl:value-of select="MEMOENTRY"/> 
      </MEMOENTRY> 
     </xsl:element>    
     </xsl:for-each> 
    </MemoPads> 

預先感謝您。

+0

我是新手,XSLT – Abhijit

+0

你嘗試過這麼遠嗎?你做的XSLT在哪裏? – AntonH

+0

你好安東,我已經更新了我的問題,提供了一些更多的想法 – Abhijit

回答

0

這是一個grouping的例子。如果您使用XSLT 1.0,則需要聲明<xsl:key>

<xsl:key name="kEntryType" match="MemoPad" use="ENTRYTYPE" /> 

提供的輸入XML格式不正確,形成爲它不含有root節點,因此我假設<MemoPads>root節點。下面的XSLT將有助於獲得所需的輸出。評論應該有助於理解邏輯。

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <!-- declare a grouping key --> 
    <xsl:key name="kEntryType" match="MemoPad" use="ENTRYTYPE" /> 

    <xsl:template match="/"> 
     <!-- create root node in output --> 
     <MemoPads> 
      <!-- loop for all the groups based on the declared key --> 
      <xsl:for-each select="//MemoPad[generate-id() = generate-id(key('kEntryType', ENTRYTYPE)[1])]"> 
       <!-- create parent element for the grouped elements --> 
       <xsl:element name="{concat(ENTRYTYPE,'Type')}"> 
        <!-- loop through the set of elements within the key --> 
        <xsl:for-each select="key('kEntryType', ENTRYTYPE)"> 
         <!-- create element as required in the output --> 
         <xsl:element name="{ENTRYTYPE}"> 
          <!-- copy all elements except the ENTRYTYPE --> 
          <xsl:copy-of select="*[not(self::ENTRYTYPE)]" /> 
         </xsl:element> 
        </xsl:for-each> 
       </xsl:element> 
      </xsl:for-each> 
     </MemoPads> 
    </xsl:template> 
</xsl:stylesheet> 

輸出

<MemoPads> 
    <ReviewFeesType> 
     <ReviewFees> 
      <ENTRYDATETIME>2017-09-05</ENTRYDATETIME> 
      <USERID>admin</USERID> 
      <MEMOENTRY>Review fees test</MEMOENTRY> 
     </ReviewFees> 
    </ReviewFeesType> 
    <UnderwriterReviewType> 
     <UnderwriterReview> 
      <ENTRYDATETIME>2017-04-12</ENTRYDATETIME> 
      <USERID>ADMIN</USERID> 
      <MEMOENTRY>Underwriter Rule</MEMOENTRY> 
     </UnderwriterReview> 
     <UnderwriterReview> 
      <ENTRYDATETIME>2017-09-05</ENTRYDATETIME> 
      <USERID>admin</USERID> 
      <MEMOENTRY>month bank statement. </MEMOENTRY> 
     </UnderwriterReview> 
    </UnderwriterReviewType> 
</MemoPads> 
+0

你好Aniket ..這是天才..它完美的工作。不過,我現在想知道XSD。我們是否爲這種棘手的XSLT編寫了xsd? – Abhijit

+0

由於輸出XML包含某些動態創建的元素,因此我對XSD不太確定。您可能想要將其作爲專家回答的另一個問題。 –