2014-10-27 95 views
1

我需要將XML文件轉換爲另一個XML文件,但是會過濾掉一些不需要的記錄。輸出XML文件需要具有輸入XML文件的確切節點結構。我認爲一個簡單的XSLT文件應該很容易做到這一點。使用XSLT過濾將XML轉換爲XML

下面是示例輸入XML文件...

<?xml version="1.0" encoding="utf-8" ?> 
<RepeaterData> 
    <Version /> 
    <Items> 
    <Item> 

     <response type="System.String">xxx</response> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester3_Dianne</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester3</approver_role> 
     <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">2</approver_workflow_sequence_in_group> 

    </Item> 
    <Item> 

     <response type="System.String">xxx</response> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester2_Ben</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester2</approver_role> 
     <approver_workflow_group type="System.Int32">1</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">3</approver_workflow_sequence_in_group> 
    </Item> 
    <Item> 

     <response type="System.String" /> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester1_Greg</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester1</approver_role> 
     <approver_workflow_group type="System.Int32">4</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">1</approver_workflow_sequence_in_group> 
    </Item> 
    <Item> 

     <response type="System.String" /> 
     <response_date type="System.String" /> 

     <digital_signature_field_profile_name type="System.String">tester4_Erin</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester4</approver_role> 
     <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">2</approver_workflow_sequence_in_group> 
    </Item> 
    <Item> 

     <response type="System.String" /> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester5_Sherry</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester5</approver_role> 
     <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">1</approver_workflow_sequence_in_group> 
    </Item> 
    </Items> 
</RepeaterData> 

這裏是所需的輸出XML文件的樣品(如果我們對響應濾波器不是空/空)...

<?xml version="1.0" encoding="utf-8"?> 
<RepeaterData> 
<Version /> 
<Items> 
<Item> 
    <response type="System.String">xxx</response> 
    <response_date type="System.String" /> 
    <digital_signature_field_profile_name type="System.String">tester3_Dianne</digital_signature_field_profile_name> 
    <approver_role type="System.String">tester3</approver_role> 
    <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
    <approver_workflow_sequence_in_group type="System.Int32">2</approver_workflow_sequence_in_group> 
</Item> 
<Item> 
    <response type="System.String">xxx</response> 
    <response_date type="System.String" /> 
    <digital_signature_field_profile_name type="System.String">tester2_Ben</digital_signature_field_profile_name> 
    <approver_role type="System.String">tester2</approver_role> 
    <approver_workflow_group type="System.Int32">1</approver_workflow_group> 
    <approver_workflow_sequence_in_group type="System.Int32">3</approver_workflow_sequence_in_group> 
</Item> 
</Items> 
</RepeaterData> 

一些努力我創造了這個XSLT ...

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
    <xsl:for-each select="/"> 
     <xsl:copy-of select ="RepeaterData/Items/Item[response != '']"/> 
    </xsl:for-each> 
</xsl:template > 
</xsl:stylesheet> 

但它產生缺失節點的XML文件。 missig節點是「RepeaterData」,「Version」和「Items」。

<?xml version="1.0" encoding="utf-8"?> 
<Item> 
    <response type="System.String">xxx</response> 
    <response_date type="System.String" /> 
    <digital_signature_field_profile_name type="System.String">tester3_Dianne</digital_signature_field_profile_name> 
    <approver_role type="System.String">tester3</approver_role> 
    <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
    <approver_workflow_sequence_in_group type="System.Int32">2</approver_workflow_sequence_in_group> 
</Item> 
<Item> 
    <response type="System.String">xxx</response> 
    <response_date type="System.String" /> 
    <digital_signature_field_profile_name type="System.String">tester2_Ben</digital_signature_field_profile_name> 
    <approver_role type="System.String">tester2</approver_role> 
    <approver_workflow_group type="System.Int32">1</approver_workflow_group> 
    <approver_workflow_sequence_in_group type="System.Int32">3</approver_workflow_sequence_in_group> 
</Item> 

人們會認爲這是建立XSLT過濾器一個通用的方法,而不必手動嵌入這些缺少的節點進入XSLT輸出。

我查看了樣本,但找不到無用數據基本上返回相同XML文件的內容。

問候奔

回答

0

使用此XSLT,它忽略Item S的具有空response元素。

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

<xsl:template match="Item[normalize-space(response) = '']"/> 

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

輸出:

<?xml version="1.0" encoding="utf-8"?> 
<RepeaterData> 
    <Version /> 
    <Items> 
    <Item> 

     <response type="System.String">xxx</response> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester3_Dianne</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester3</approver_role> 
     <approver_workflow_group type="System.Int32">3</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">2</approver_workflow_sequence_in_group> 

    </Item> 
    <Item> 

     <response type="System.String">xxx</response> 
     <response_date type="System.String" /> 
     <digital_signature_field_profile_name type="System.String">tester2_Ben</digital_signature_field_profile_name> 
     <approver_role type="System.String">tester2</approver_role> 
     <approver_workflow_group type="System.Int32">1</approver_workflow_group> 
     <approver_workflow_sequence_in_group type="System.Int32">3</approver_workflow_sequence_in_group> 
    </Item> 



    </Items> 
</RepeaterData> 
+1

謝謝。這是我正在尋找的。我曾嘗試過幾個與此類似的XSLT版本,但還沒有達到正確的模板組合。我知道有更好更簡單的XSLT。 – 2014-10-29 20:10:36

0

我需要將XML文件中的另一個XML文件,但過濾掉一些不必要的 記錄。輸出XML文件需要具有輸入XML文件的確切節點 結構。

這是一個常見的要求。通常通過從identity transform template開始,按原樣複製所有內容,然後添加特定模板來抑制希望排除的節點。

+0

這加上下一個答案是有道理的。 – 2014-10-29 20:11:27