使用XSLT过滤的XML到XML

时间:2014-10-27 20:41:56

标签: xml xslt xpath

我需要将XML文件转换为另一个XML文件,但过滤掉一些不需要的记录。输出XML文件需要具有输入XML文件的确切节点结构。我认为一个简单的XSLT文件应该可以轻松完成。

以下是输入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文件的示例(如果我们过滤响应IS非空/ null)...

<?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文件而没有不需要的数据的内容。

关心Ben

2 个答案:

答案 0 :(得分:0)

使用此XSLT,它会忽略具有空Item元素的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 :(得分:0)

  

我需要将XML文件转换为另一个XML文件,但过滤掉一些   不需要的记录。输出XML文件需要具有确切的节点   输入XML文件的结构。

这是一个常见的要求。通常通过以identity transform template开头按原样复制所有内容,然后添加特定模板来抑制要排除的节点来解决。