用open和close标签替换xsi:nil =“true”

时间:2017-07-27 10:54:59

标签: xslt

我需要进行以下转换,以便通过不理解xsi:nil=“true”的集成代理程序传递消息。我知道,对于像<abc></abc>这样的字符串的字符串与<abc xsi:nil=“true”/>不一样,但我没有选择。

我的输入XML:

<PART>
<LENGTH_UOM xsi:nil="1"/>
            <WIDTH xsi:nil="1"/>
</PART>

预期结果:

<PART>
    <LENGTH_UOM><LENGTH_UOM>
    <WIDTH></WIDTH>
</PART>

请告诉我你的建议。

1 个答案:

答案 0 :(得分:1)

要删除所有xsi:nil属性,请将身份模板与匹配xsi:nil的空模板合并。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://xsi.com">     
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

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

  <xsl:template match="@xsi:nil" />                <!-- empty template -->

</xsl:stylesheet>

如果您只想删除值为true的那些,请使用以下空模板。

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

关于 Martin Honnen 所述的开始和结束标记主题I suggest reading this SO question(在答案的评论中):

  

我担心空元素是否被标记为或者不是与XML有关的东西,并且通常不是您可以使用XSLT处理器控制的东西。