Xsl转换删除xml的部分

时间:2012-07-23 13:38:44

标签: xml xslt

你好我一直试图删除xml的某些部分一段时间,它根本不适合我。让我首先列出我的要求:

1。删除所有值为空的节点属性或值'length< 1例如:

<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>

应该成为<pr:Text approved="true">Mon-Sun 12HR</pr:Text>

我想我已经知道了这一部分(我想),如果我错了,请纠正我:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:if test=". != ''">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

2. 删除其子级没有文本值的整个节点(元素),例如:

<pr:WorkingHoursInfo>
    <pr:WorkingHoursList>
              <pr:WorkingHours dayOfweek="MONDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="TUESDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="WEDNESDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="THURSDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="FRIDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="SATURDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="SUNDAY">
            </pr:WorkingHours>
    </pr:WorkingHoursList>
</pr:WorkingHoursInfo>

应该成为:

<pr:WorkingHoursInfo>
</pr:WorkingHoursInfo>

所以如果可能的话,我应该一次完成这两个转换。我目前仍然坚持这个#2任何帮助是适当的

问题更新:

Martin Honnen个答案将xsl文件更改为:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="@*[not(normalize-space())]"/>
<xsl:template match="*[not(*/*) and not(*[normalize-space()])]"/>
</xsl:stylesheet>

但现在违反了要求 1。,现在{x}已从xml中删除{。}}。

另一次更新:

来自<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>

几乎正常工作,因此Martin Honnen正在运作,1正在运作(差不多)。一个例外是没有没有文本值的子元素的单个元素没有被删除,即:

2

这也应该删除。所以它几乎正常运作。

1 个答案:

答案 0 :(得分:1)

你从

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

然后为您拥有的任务添加模板,例如

<xsl:template match="@*[not(normalize-space())]"/>

确保删除空属性

<xsl:template match="*[not(normalize-space()) and not(*/*) and not(*[normalize-space()])]"/>

确保删除没有任何大子元素且没有包含文本的子元素的元素。

[编辑] 这是一个完整的样式表

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

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


<xsl:template match="@*[not(normalize-space())]"/>

<xsl:template match="*[not(normalize-space()) and not(*/*) and not(*[normalize-space()])]"/>

</xsl:stylesheet>

当我使用Saxon 6.5.5在输入上应用该样式表时

<pr:root
  xmlns:pr="http://example.com/pr">

<pr:WorkingHoursInfo>
    <pr:WorkingHoursList>
              <pr:WorkingHours dayOfweek="MONDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="TUESDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="WEDNESDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="THURSDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="FRIDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="SATURDAY">
            </pr:WorkingHours>
              <pr:WorkingHours dayOfweek="SUNDAY">
            </pr:WorkingHours>
    </pr:WorkingHoursList>
</pr:WorkingHoursInfo>

<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>

<pr:DescriptionAttribute Type="PRIMARY"/>

</pr:root>

然后结果是

<pr:root xmlns:pr="http://example.com/pr">

<pr:WorkingHoursInfo>

</pr:WorkingHoursInfo>

<pr:Text approved="true">Mon-Sun 12HR</pr:Text>



</pr:root>

因此删除了空元素<pr:DescriptionAttribute Type="PRIMARY"/>