2

您好,我一直在尝试删除 xml 的某些部分,但它根本不适合我。让我首先列出我的要求:

1.删​​除所有值为空白或值长度<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.现在<pr:Text default="" approved="true" type="">Mon-Sun 12HR</pr:Text>从 xml 中删除。

另一个更新:

Martin Honnen几乎工作开始,所以1正在工作并且2正在工作(几乎)。一个例外是没有子元素且没有文本值的单个元素不会被删除,即:

<pr:DescriptionAttribute Type="PRIMARY"/>

这也应该删除。所以它几乎可以工作了。

4

1 回答 1

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"/>被删除。

于 2012-07-23T13:55:06.317 回答