我想从xslt文件中的特定外部标记中删除某些标记

时间:2013-12-06 09:35:34

标签: xslt

我遇到了一个场景,我需要删除只有外部标头标记中的“if”条件的标记,而不是 DATA 标记....是摘录:

<Header>
  <xsl:if test="Name">
   <xsl:for-each select="Name">
   <Name>
    <xsl:value-of select="."/>
   </Name>
  </xsl:for-each>
 </xsl:if>

 <xsl:if test="aaa">
 <Code>
  <xsl:value-of select="xxxx"/>
 </Code>
 </xsl:if>

</Header>
<Data>
  <xsl:if test="Name">
    ---------
  </xsl:if>
  <xsl:if test="aaa">
    ------
  </xsl:if>
</Data>

输出应为:

<Header>
 <xsl:for-each select="Name">
   <Name>
    <xsl:value-of select="."/>
   </Name>
  </xsl:for-each>
  <Code>
  <xsl:value-of select="xxxx"/>
  </Code>
</Header>
<Data>
 <xsl:if test="Name">
   ---------
 </xsl:if>
 <xsl:if test="aaa">
  ------
 </xsl:if>   
</Data>

请告知。

1 个答案:

答案 0 :(得分:0)

执行带有异常的标识转换,即如果它是xsl:if元素的子元素,则删除Header语句。请注意,您还需要显式匹配xsl:if的属性,否则转换将失败。

假设输入正确(一个名为root的文档节点带有XSL名称空间且输入XML中没有“-------”),这是一种方法。

对于您将来的问题,请务必始终显示您的努力,这是您自己尝试解决问题的方法。否则人们不会总是愿意帮助你。

<强>样式表

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="xsl:if[parent::Header]|xsl:if[parent::Header]/@*">
  <xsl:apply-templates select="@*|node()"/>
</xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <Header>
  <xsl:for-each select="Name">
     <Name>
        <xsl:value-of select="."/>
     </Name>
  </xsl:for-each>
  <Code>
     <xsl:value-of select="xxxx"/>
  </Code>
 </Header>
 <Data>
  <xsl:if test="Name"><!--further processing--></xsl:if>
  <xsl:if test="aaa"><!--further processing--></xsl:if>
 </Data>
</root>