XSLT 替换属性具有定义值的元素文本

时间:2021-03-16 13:27:30

标签: xslt

我第一次处理 XSL 转换,我需要你的帮助! 基本上,我只想用样式表重新格式化 XML。除了在 CDATA 标签中已经是 XML 格式的一些文本元素之外,应用身份转换是有效的。

原始 XML:

<Views>
    <View name="View 1">
        <parameter name="MultiPanedView" value="1" dt="3">
        </parameter>
        <parameter name="Layout" dt="4095"><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<xamDockManager version="9.2.20092.2186">
<contentPanes>
<contentPane name="Pane0eb6000a_b569_413b_92d6_07abd8fba376" location="Document" />
</contentPanes>
<panes />
<documents splitterOrientation="Vertical">
<splitPane name="viewsSplitPane" splitterOrientation="Vertical">
<tabGroup name="viewsTabGroupPane" selectedIndex="0">
<contentPane name="Pane0eb6000a_b569_413b_92d6_07abd8fba376" />
</tabGroup>
</splitPane>
</documents>
</xamDockManager>]]></parameter>
        <Pane1>
        </Pane1>
    </View>
</Views>

结果:

<Views>
      <View name="View 1">
            <parameter name="MultiPanedView" value="1" dt="3">
        </parameter>
            <parameter><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<xamDockManager version="9.2.20092.2186">
<contentPanes>
<contentPane name="Pane0eb6000a_b569_413b_92d6_07abd8fba376" location="Document" />
</contentPanes>
<panes />
<documents splitterOrientation="Vertical">
<splitPane name="viewsSplitPane" splitterOrientation="Vertical">
<tabGroup name="viewsTabGroupPane" selectedIndex="0">
<contentPane name="Pane0eb6000a_b569_413b_92d6_07abd8fba376" />
</tabGroup>
</splitPane>
</documents>
</xamDockManager>]]></parameter>
            <Pane1>
        </Pane1>
      </View>
</Views>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
  <!-- IDENTITY TRANSFORM -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- RETAIN XML MARKUP INSIDE CDATA -->
  <xsl:template match="parameter[@dt='4095']">
    <xsl:copy>
      <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
        <xsl:value-of select="." disable-output-escaping="yes"/>
      <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>  
    </xsl:copy>    
  </xsl:template> 
</xsl:stylesheet>

如您所见,文本显示正确,但参数的属性丢失了!

提前致谢! 那里提供在线 XSL 转换: http://xsltransform.net/3Ngx5b4

1 个答案:

答案 0 :(得分:0)

你快到了。只需像这样更改模板

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0">
    <xsl:output indent="yes"/>
  <!-- IDENTITY TRANSFORM -->
  <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <!-- RETAIN XML MARKUP INSIDE CDATA -->
  <xsl:template match="parameter[@dt='4095']">
    <parameter name="Layout" dt="4095">
        <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
        <xsl:value-of select="." disable-output-escaping="yes"/>
        <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>  
    </parameter>    
  </xsl:template>
</xsl:stylesheet>
相关问题