【问题标题】:XSLT replace element text whose attribute has a defined valueXSLT 替换其属性具有已定义值的元素文本
【发布时间】:2021-03-16 13:27:30
【问题描述】:

我第一次处理 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

【问题讨论】:

    标签: xslt


    【解决方案1】:

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

    <?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>
    

    【讨论】:

    • 谢谢,正是我需要的一点帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多