xslt:删除一行注释,包括空格

时间:2016-09-14 06:46:50

标签: xml xslt

我想改变这个

<appSettings>
  <!-- comment1 -->
  <add key="Value1" value="11" />

  <!-- comment2 -->
  <add key="Value2" value="22" />
</appSettings>

使用xslt

<appSettings>
  <!-- comment1 -->
  <add key="Value1" value="11" />

  <add key="Value2" value="22" />
</appSettings>

这是我试过的xslt

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
  exclude-result-prefixes="msxsl">

  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

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

  <xsl:template match="comment()[contains(., 'comment2')]" />
</xsl:stylesheet>

但后来我

<appSettings>
  <!-- comment1 -->
  <add key="Value1" value="11" />

\r\n__  <- NewLine and Spaces I want to avoid
  <add key="Value2" value="22" />
</appSettings>

如何完全删除包含评论节点的行?

XSLFiddle

2 个答案:

答案 0 :(得分:1)

添加:

<xsl:strip-space elements="*"/>

位于样式表的顶层。

请参阅:https://www.w3.org/TR/xslt/#strip

答案 1 :(得分:1)

如果您真的想这样做,可以尝试从indent="yes"中删除xml:output选项,然后使用模板来匹配并忽略任何紧接在注释之前的仅空白节点。 / p>

试试这个XSLT

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
  exclude-result-prefixes="msxsl">

  <xsl:output method="xml" indent="no" omit-xml-declaration="yes" />

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

  <xsl:template match="comment()[contains(., 'comment2')]" />
  <xsl:template match="text()[not(normalize-space())]
                             [preceding-sibling::node()[1][self::comment()[contains(., 'comment2')]]]" />
</xsl:stylesheet>

http://xsltransform.net/pPJ8LV3

进行测试