2012-07-13 78 views
1

我完全卡住了。我正在尝试使用XLST来查找/替换我的xml输出文件的部分内容。我甚至没有出发点。我试过使用Altova DiffDog来自动生成我的xlst,因为我没有牢牢掌握如何自己编写它。需要帮助删除文本并通过XLST替换xlm

这是我目前的XML输出文件:

<?xml version='1.0' encoding='UTF-8'?> 
<BB:Report_Data xmlns:BB="urn:com.playdate.report/Report-Outbound"> 
    <BB:Report_Entry> 
     <BB:leaveBalanceTotal.employeeId>1234567</BB:leaveBalanceTotal.employeeId> 
     <BB:leaveBalanceTotal.bmbId>9280136270</BB:leaveBalanceTotal.bmbId> 
     <BB:All_Eligible_Time_Off_Plans_for_Worker> 
     <BB:leaveBalanceTotal.leaveCodeId>1010</BB:leaveBalanceTotal.leaveCodeId> 
     <BB:leaveBalanceTotal.balanceAmount>0</BB:leaveBalanceTotal.balanceAmount> 
     <BB:leaveBalanceTotal.effectiveDate>2012-07-05</BB:leaveBalanceTotal.effectiveDate> 
     <BB:leaveBalanceTotal.lastPayEndDate>2012-07-05</BB:leaveBalanceTotal.lastPayEndDate> 
     </BB:All_Eligible_Time_Off_Plans_for_Worker> 
     <BB:All_Eligible_Time_Off_Plans_for_Worker> 
     <BB:leaveBalanceTotal.leaveCodeId>1014</BB:leaveBalanceTotal.leaveCodeId> 
     <BB:leaveBalanceTotal.balanceAmount>96</BB:leaveBalanceTotal.balanceAmount> 
     <BB:leaveBalanceTotal.effectiveDate>2012-07-05</BB:leaveBalanceTotal.effectiveDate> 
     <BB:leaveBalanceTotal.lastPayEndDate>2012-07-05</BB:leaveBalanceTotal.lastPayEndDate> 
     </BB:All_Eligible_Time_Off_Plans_for_Worker> 
     <BB:leaveBalanceTotal.totalDaysService>1459</BB:leaveBalanceTotal.totalDaysService> 
    </BB:Report_Entry> 
</BB:Report_Data> 

这是我需要它看起来像:

<?xml version='1.0' encoding='UTF-8'?> 
<BB:Report_Data xmlns:BB="urn:com.playdate.report/Report-Outbound"> 
    <leaveBalanceTotal> 
     <leaveBalanceTotal.employeeId>1234567</leaveBalanceTotal.employeeId> 
     <leaveBalanceTotal.bmbId>9280136270</leaveBalanceTotal.bmbId> 
     <leaveBalanceTotal.leaveCodeId>1010</leaveBalanceTotal.leaveCodeId> 
     <leaveBalanceTotal.balanceAmount>0</leaveBalanceTotal.balanceAmount> 
     <leaveBalanceTotal.effectiveDate>2012-07-05</leaveBalanceTotal.effectiveDate> 
     <leaveBalanceTotal.lastPayEndDate>2012-07-05</leaveBalanceTotal.lastPayEndDate> 
     <leaveBalanceTotal.leaveCodeId>1014</leaveBalanceTotal.leaveCodeId> 
     <leaveBalanceTotal.balanceAmount>96</leaveBalanceTotal.balanceAmount> 
     <leaveBalanceTotal.effectiveDate>2012-07-05</leaveBalanceTotal.effectiveDate> 
     <leaveBalanceTotal.lastPayEndDate>2012-07-05</leaveBalanceTotal.lastPayEndDate> 
     <leaveBalanceTotal.totalDaysService>1459</leaveBalanceTotal.totalDaysService> 
    </leaveBalanceTotal> 
</BB:Report_Data> 

基本上我试图删除以下的所有实例:

  1. BB:All_Eligible_Time_Off_Plans_for_Worker
  2. /BB:All_Eligible_Time_Off_Plans_for_Worker
  3. BB:

而且我需要leaveBalanceTotal更换Report_Entry。

任何帮助,将不胜感激!

回答

0

这是另一个XSLT 1.0选项。这也将保留数据可能具有的任何属性。

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:BB="urn:com.playdate.report/Report-Outbound" 
    exclude-result-prefixes="BB"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="comment()|processing-instruction()|@*"> 
     <xsl:copy/> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="BB:All_Eligible_Time_Off_Plans_for_Worker"> 
     <xsl:apply-templates/> 
    </xsl:template> 

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

    <xsl:template match="BB:Report_Entry"> 
     <leaveBalanceTotal> 
      <xsl:apply-templates select="node()|@*"/> 
     </leaveBalanceTotal> 
    </xsl:template> 

</xsl:stylesheet> 

输出

<BB:Report_Data xmlns:BB="urn:com.playdate.report/Report-Outbound"> 
    <leaveBalanceTotal> 
     <leaveBalanceTotal.employeeId>1234567</leaveBalanceTotal.employeeId> 
     <leaveBalanceTotal.bmbId>9280136270</leaveBalanceTotal.bmbId> 
     <leaveBalanceTotal.leaveCodeId>1010</leaveBalanceTotal.leaveCodeId> 
     <leaveBalanceTotal.balanceAmount>0</leaveBalanceTotal.balanceAmount> 
     <leaveBalanceTotal.effectiveDate>2012-07-05</leaveBalanceTotal.effectiveDate> 
     <leaveBalanceTotal.lastPayEndDate>2012-07-05</leaveBalanceTotal.lastPayEndDate> 
     <leaveBalanceTotal.leaveCodeId>1014</leaveBalanceTotal.leaveCodeId> 
     <leaveBalanceTotal.balanceAmount>96</leaveBalanceTotal.balanceAmount> 
     <leaveBalanceTotal.effectiveDate>2012-07-05</leaveBalanceTotal.effectiveDate> 
     <leaveBalanceTotal.lastPayEndDate>2012-07-05</leaveBalanceTotal.lastPayEndDate> 
     <leaveBalanceTotal.totalDaysService>1459</leaveBalanceTotal.totalDaysService> 
    </leaveBalanceTotal> 
</BB:Report_Data> 
+0

您的第一个模板下的xsl:apply-templates是毫无意义的浪费。这些节点类型永远不会有子节点。 – 2012-07-13 18:13:10

+0

非常感谢!它像一个魅力!我非常感谢你的时间。 – 2012-07-13 18:38:36

+0

@ LC_123 - 非常欢迎。 – 2012-07-13 18:41:54

0

当该XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:BB="urn:com.playdate.report/Report-Outbound" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output omit-xml-declaration="no" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!-- Identity Template: copies everything as-is --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Remove BB:All_Eligible_Time_Off_Plans_for_Worker elements --> 
    <!-- right away, but process their children --> 
    <xsl:template match="BB:All_Eligible_Time_Off_Plans_for_Worker" priority="2"> 
    <xsl:apply-templates /> 
    </xsl:template> 

    <!-- Replace BB:Report_Entry elements with leaveBalanceTotal ones --> 
    <xsl:template match="BB:Report_Entry"> 
    <leaveBalanceTotal> 
     <xsl:apply-templates /> 
    </leaveBalanceTotal>  
    </xsl:template> 

    <!-- Remove BB namespace from descendent elements --> 
    <xsl:template match="BB:Report_Entry/* | 
     BB:All_Eligible_Time_Off_Plans_for_Worker/*"> 
    <xsl:element name="{local-name(.)}"> 
     <xsl:apply-templates /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

...被施加到所提供的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<BB:Report_Data xmlns:BB="urn:com.playdate.report/Report-Outbound"> 
    <BB:Report_Entry> 
    <BB:leaveBalanceTotal.employeeId>1234567</BB:leaveBalanceTotal.employeeId> 
    <BB:leaveBalanceTotal.bmbId>9280136270</BB:leaveBalanceTotal.bmbId> 
    <BB:All_Eligible_Time_Off_Plans_for_Worker> 
     <BB:leaveBalanceTotal.leaveCodeId>1010</BB:leaveBalanceTotal.leaveCodeId> 
     <BB:leaveBalanceTotal.balanceAmount>0</BB:leaveBalanceTotal.balanceAmount> 
     <BB:leaveBalanceTotal.effectiveDate>2012-07-05</BB:leaveBalanceTotal.effectiveDate> 
     <BB:leaveBalanceTotal.lastPayEndDate>2012-07-05</BB:leaveBalanceTotal.lastPayEndDate> 
    </BB:All_Eligible_Time_Off_Plans_for_Worker> 
    <BB:All_Eligible_Time_Off_Plans_for_Worker> 
     <BB:leaveBalanceTotal.leaveCodeId>1014</BB:leaveBalanceTotal.leaveCodeId> 
     <BB:leaveBalanceTotal.balanceAmount>96</BB:leaveBalanceTotal.balanceAmount> 
     <BB:leaveBalanceTotal.effectiveDate>2012-07-05</BB:leaveBalanceTotal.effectiveDate> 
     <BB:leaveBalanceTotal.lastPayEndDate>2012-07-05</BB:leaveBalanceTotal.lastPayEndDate> 
    </BB:All_Eligible_Time_Off_Plans_for_Worker> 
    <BB:leaveBalanceTotal.totalDaysService>1459</BB:leaveBalanceTotal.totalDaysService> 
    </BB:Report_Entry> 
</BB:Report_Data> 

...预期的结果产生:

<?xml version="1.0" encoding="UTF-8"?> 
<BB:Report_Data xmlns:BB="urn:com.playdate.report/Report-Outbound"> 
    <leaveBalanceTotal> 
    <leaveBalanceTotal.employeeId>1234567</leaveBalanceTotal.employeeId> 
    <leaveBalanceTotal.bmbId>9280136270</leaveBalanceTotal.bmbId> 
    <leaveBalanceTotal.leaveCodeId>1010</leaveBalanceTotal.leaveCodeId> 
    <leaveBalanceTotal.balanceAmount>0</leaveBalanceTotal.balanceAmount> 
    <leaveBalanceTotal.effectiveDate>2012-07-05</leaveBalanceTotal.effectiveDate> 
    <leaveBalanceTotal.lastPayEndDate>2012-07-05</leaveBalanceTotal.lastPayEndDate> 
    <leaveBalanceTotal.leaveCodeId>1014</leaveBalanceTotal.leaveCodeId> 
    <leaveBalanceTotal.balanceAmount>96</leaveBalanceTotal.balanceAmount> 
    <leaveBalanceTotal.effectiveDate>2012-07-05</leaveBalanceTotal.effectiveDate> 
    <leaveBalanceTotal.lastPayEndDate>2012-07-05</leaveBalanceTotal.lastPayEndDate> 
    <leaveBalanceTotal.totalDaysService>1459</leaveBalanceTotal.totalDaysService> 
    </leaveBalanceTotal> 
</BB:Report_Data> 

希望有帮助!如果您有任何问题,请告诉我。

+0

你忘记了在过去的3个模板复制属性。除非运营机构另有规定,否则假设它们可能在那里,这将是一个更好的解决办法。由于排序,匹配表达式“node()| @ *”效率较低,“@ * | node()”。最好使用local-name()而不是local-name(。)。 – 2012-07-13 18:24:20

+0

@ SeanB.Durkin - 感谢您的评论;非常感激。我没有包含属性,因为OP的原始问题没有包含它们。我尝试回答具体问题,而不是假设没有明确说明的东西。 – ABach 2012-07-13 23:49:27