xsl transform有助于删除某个标记

时间:2016-03-10 19:48:16

标签: xml xslt xslt-1.0

鉴于xml的这一部分,我需要删除任何包含xsi:nil="true"

的标记

我目前正在使用此XSL删除空白节点,因此也需要保留它。附在下面。感谢。

XML:

<ns1:EmployeeOfferAndCoverageGrp xmlns:ns1="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ns1:AnnualOfferOfCoverageCd>1G</ns1:AnnualOfferOfCoverageCd>
  <ns1:AnnlShrLowestCostMthlyPremAmt xsi:nil="true" />
  <ns1:MonthlyShareOfLowestCostMonthlyPremGrp>
    <ns1:JanuaryAmt>0</ns1:JanuaryAmt>
    <ns1:FebruaryAmt>0</ns1:FebruaryAmt>
    <ns1:MarchAmt>0</ns1:MarchAmt>
    <ns1:AprilAmt>0</ns1:AprilAmt>
    <ns1:MayAmt>0</ns1:MayAmt>
    <ns1:JuneAmt>0</ns1:JuneAmt>
    <ns1:JulyAmt>0</ns1:JulyAmt>
    <ns1:AugustAmt>0</ns1:AugustAmt>
    <ns1:SeptemberAmt>0</ns1:SeptemberAmt>
    <ns1:OctoberAmt>0</ns1:OctoberAmt>
    <ns1:NovemberAmt>0</ns1:NovemberAmt>
    <ns1:DecemberAmt>0</ns1:DecemberAmt>
  </ns1:MonthlyShareOfLowestCostMonthlyPremGrp>
</ns1:EmployeeOfferAndCoverageGrp>

XSL

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="node()|SDLT">
    <xsl:if test="count(descendant::text()[string-length(normalize-space(.)) &gt; 0] | @*[string-length(.) &gt; 0])">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
      </xsl:copy>
    </xsl:if>
  </xsl:template>

  <xsl:template match="@*">
    <xsl:copy />
  </xsl:template>

  <xsl:template match="text()">
    <xsl:value-of select="normalize-space(.)" />
  </xsl:template>
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:1)

鉴于您必须将名称空间添加到XML以及XSLT中

xmlns:xsi="http://some.thing" and xmlns:ns1="some.other.thing"

您只需将以下行添加到样式表中:

<xsl:template match="*[@xsi:nil = 'true']" />

如果没有名称空间,您可以从上面的表达式中省略'xsi:'。

结果:

<ns1:EmployeeOfferAndCoverageGrp xmlns:xsi="http://some.thing" xmlns:ns1="some.other.thing">
    <ns1:AnnualOfferOfCoverageCd>1G</ns1:AnnualOfferOfCoverageCd>
    <ns1:MonthlyShareOfLowestCostMonthlyPremGrp>
        <ns1:JanuaryAmt>0</ns1:JanuaryAmt>
        <ns1:FebruaryAmt>0</ns1:FebruaryAmt>
        <ns1:MarchAmt>0</ns1:MarchAmt>
        <ns1:AprilAmt>0</ns1:AprilAmt>
        <ns1:MayAmt>0</ns1:MayAmt>
        <ns1:JuneAmt>0</ns1:JuneAmt>
        <ns1:JulyAmt>0</ns1:JulyAmt>
        <ns1:AugustAmt>0</ns1:AugustAmt>
        <ns1:SeptemberAmt>0</ns1:SeptemberAmt>
        <ns1:OctoberAmt>0</ns1:OctoberAmt>
        <ns1:NovemberAmt>0</ns1:NovemberAmt>
        <ns1:DecemberAmt>0</ns1:DecemberAmt>
    </ns1:MonthlyShareOfLowestCostMonthlyPremGrp>
</ns1:EmployeeOfferAndCoverageGrp>

答案 1 :(得分:1)

这应该让你相当远。用适当的值替换ns1的名称空间URI。

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns1="http://tempuri.org/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
  <xsl:output omit-xml-declaration="yes" indent="yes" />
  <xsl:strip-space elements="*" />

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

  <xsl:template match="*[@xsi:nil = 'true']" />

  <xsl:template match="text()">
    <xsl:value-of select="normalize-space(.)" />
  </xsl:template>
</xsl:stylesheet>