我第一次处理 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"><![CDATA[</xsl:text>
<xsl:value-of select="." disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如您所见,文本显示正确,但参数的属性丢失了!
提前致谢! 那里提供在线 XSL 转换: http://xsltransform.net/3Ngx5b4
答案 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"><![CDATA[</xsl:text>
<xsl:value-of select="." disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</parameter>
</xsl:template>
</xsl:stylesheet>