xml – XSLT:使用多个或’模板匹配来应用模板

前端之家收集整理的这篇文章主要介绍了xml – XSLT:使用多个或’模板匹配来应用模板前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个 XML,每个具有相似数据的多个节点.我想从每个节点删除一个特定的属性(USER:IPADDRESS).我已经弄清楚如何使用ors链接一些元素,只是省略了User =“{@ User}”匹配,因此它不会显示在结果中:

XSL片段:

  1. <xsl:template match="Creation | Test | Assignment | Modification | Repair | Termination">
  2. <Creation CommitID="{@CommitID}" Date="{@Date}" BoardID="{@BoardID}">
  3. <xsl:apply-templates/>
  4. </Creation>
  5. </xsl:template>

令人惊讶的是,“创建”之后的所有节点名称都被重新命名为创建,因为这正是我要告诉它的.如何通过各种比赛,以便在结果中按正确的顺序进行应用?我知道我可以使用相同的XSL语句为每个各种比赛(这是我第一次做到这一点),但是必须有一个更优雅的方法,这只是回避我.我有数百万数百万行XML的处理,这只是我将要做的许多转换中的第一个.

我在Win7框上使用msxsl V4.0来做我的转换,如果有任何后果.

XML:

  1. <?xml version="1.0"?>
  2. <BoardDatabase>
  3. <Board_Data BoardID="1035">
  4. <Creation CommitID="12b" Date="2007-12-07T15:43:51" BoardID="1035" User="CSAGAN:192.168.1.177">
  5. <BoardDrawing>3B</BoardDrawing>
  6. <AssemblyDrawing>2010F</AssemblyDrawing>
  7. <Notes>PO Num 1959</Notes>
  8. </Creation>
  9. <Test CommitID="117" Date="2007-12-10T10:39:43" BoardID="1035" User="CSAGAN:192.168.1.183">
  10. <ElectricalTestData Result="FAIL" Version="IMM STD REVF">
  11. <AutomatedTest ReportVersion="1.0">
  12. <TestSetup>
  13. <TestAppBuildDate>Dec 07 2007</TestAppBuildDate>
  14. <VersionPath>c:\tests\versions\v12.txt</VersionPath>
  15. <VersionNumber>1.2</VersionNumber>
  16. <OperatorName>CSAGAN</OperatorName>
  17. <StationID>PC-191-NDGrasse</StationID>
  18. <JigSN>12345</JigSN>
  19. <JigAssembly>42</JigAssembly>
  20. <TestStartTime>2007-12-10 10:34:17</TestStartTime>
  21. </TestSetup>
  22. </AutomatedTest>
  23. </ElectricalTestData>
  24. </Test>
  25. <Assignment CommitID="1c1f" User="JRandi:192.168.1.162" Date="2008-09-30T07:36:52" BoardID="1035">
  26. <Notes>Boardset Failed etest twice,no problem log entry/repair attempts made.</Notes>
  27. </Assignment>
  28. <Modification CommitID="2bb7" User="JRandi:192.168.1.162" Date="2009-03-11T13:31:21" BoardID="1035">
  29. <AssemblyDrawing>2001G</AssemblyDrawing>
  30. <Notes>Cornelius upgraded boardset to rev. G</Notes>
  31. </Modification>
  32. </Board_Data>
  33. </BoardDatabase>

XSL:

  1. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  2.  
  3. <xsl:template match="Creation | Test | Assignment | Modification | Repair | Termination">
  4. <Creation CommitID="{@CommitID}" Date="{@Date}" BoardID="{@BoardID}">
  5. <xsl:apply-templates/>
  6. </Creation>
  7. </xsl:template>
  8.  
  9. <xsl:template match="@*|node()">
  10. <xsl:copy>
  11. <xsl:apply-templates select="@*|node()"/>
  12. </xsl:copy>
  13. </xsl:template>
  14. </xsl:stylesheet>

最新XSL使用@ DevNull的解决方案,使原始文件的大小加倍:

  1. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  2.  
  3. <!-- Answer from Stack Overflow that only strips out the IP Address from the User attribute. -->
  4. <xsl:template match="@User">
  5. <xsl:attribute name="User">
  6. <xsl:value-of select="substring-before(.,':')"/>
  7. </xsl:attribute>
  8. </xsl:template>
  9.  
  10. <xsl:template match="@*|node()">
  11. <xsl:copy>
  12. <xsl:apply-templates select="@*|node()"/>
  13. </xsl:copy>
  14. </xsl:template>
  15. </xsl:stylesheet>

来自@ Dimitre的解决方案的最新XSL需要很长时间才能处理(30分钟后仍然运行,但文件仍在增长):

  1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2. <xsl:output omit-xml-declaration="yes" indent="yes"/>
  3. <xsl:strip-space elements="*"/>
  4.  
  5. <xsl:template match="node()|@*">
  6. <xsl:copy>
  7. <xsl:apply-templates select="node()|@*"/>
  8. </xsl:copy>
  9. </xsl:template>
  10.  
  11. <xsl:template match=
  12. "*[contains('|Creation|Test|Assignment|Modification|Repair|Termination|',concat('|',name(),'|'))
  13. ]/@user"/>
  14. </xsl:stylesheet>
尝试将您的模板更改为:
  1. <xsl:template match="Creation|Test|Assignment|Modification|Repair|Termination">
  2. <xsl:copy>
  3. <xsl:apply-templates select="@*[not(name()='User')]|node()"/>
  4. </xsl:copy>
  5. </xsl:template>

你会注意到它看起来很像你的身份模板,添加到@ *的谓词.

此外,如果您想剥夺所有用户属性,无论元素是什么,您可以使用此模板:

  1. <xsl:template match="@User"/>

这是另一种方式(只是从创造和测试简单地剥离)

  1. <xsl:template match="@User[..[self::Creation or self::Test]]"/>

回答评论

改用此模板:

  1. <xsl:template match="@User">
  2. <xsl:attribute name="User">
  3. <xsl:value-of select="substring-before(.,':')"/>
  4. </xsl:attribute>
  5. </xsl:template>

猜你在找的XML相关文章