xslt - 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"><![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
解决方案
您快到了。只需像这样更改模板
<?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>
推荐阅读
- sockets - 如何减少通过多播发送的数据包的传输大小?
- html - react-select inputProps 未应用于 AsyncSelect
- javascript - 有没有办法独立处理为多个可观察对象发出的值,然后在所有可观察对象都完成时做一些事情?
- git - 在合并之前将远程 HEAD 重置为特定的提交
- laravel - 使用 vuejs 和 laravel 将嵌套数据存储在文件中
- bash - 将 Xterm 的输出重定向到日志文件
- python - 尝试使用 Python 请求从 url 下载电子表格时获取登录页面
- javascript - 如何使用 jQuery 过滤处理多个数据属性?
- java - 节点作为反向代理限制了 java 后端的并发性
- javascript - 跳到 JSON 数组中的下一个对象并填充输入框