带有转义实体的xslt转换

时间:2016-03-25 13:10:51

标签: xml xslt xslt-1.0 libxslt

我有一个XML,我想用下面的xslt将属性值(name =“name”)更改为另一个(name =“value”):

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
<script>
    var jq191 = jQuery.noConflict(true);
</script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>
<script>
    var jq132 = jQuery.noConflict(true);
</script>

<script>

    jq191(document).ready(function() {

       // use the newer version to load the script
        jq191.getScript( "{$baseurl}/js/jetmenu.js" )
          .done(function( script, textStatus ) {
            console.log( textStatus );

            // locally override the $() to use the older version of jQuery
            var $ = jq132;

            // Use the loaded script
            $.jetmenu();

          })
          .fail(function( jqxhr, settings, exception ) {
            console.error( "Triggered ajaxError handler." );
          });

        // use the newer one from now on
        $ = jq191;

    }); // ready

</script>

XML INPUT代码段:

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

<!--xsl:template match="text()"-->
<!--xsl:text select="." disable-output-escaping="yes" /-->
<!--xsl:value-of select="." disable-output-escaping="yes" />
   <xsl:copy-of select="child::*"/> 
  </xsl:template-->

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

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

<xsl:template match="@name" mode="se">
    <xsl:attribute name="name">value</xsl:attribute>
</xsl:template>
<xsl:template match="tag5[@type='testtype']">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" mode="s"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="tag6[@name='name']" mode="s">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" mode="se"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

应用xslt后的XML OUTPUT是:

<?xml version="1.0" encoding="UTF-8"?>
<dataroot version="2.0">
<Model id="111" name="test">
    <tag1 id="222" type="VERSION">
        <tag2 id="333" name="Version" value="2"/>
    </tag1>
    <tag3 id="444">
        <tag4 id="555" versionID="test/00001" name="name" definition="through test. &#xD;&#xA;" attrs="12 23"/>
        <tag4 id="666" versionID="test/00001" name="name" definition="through test 2. &#xD;&#xA;" messages="34 45"/>
    </tag3>
    <tag5 id="777" type="testtype">
        <tag6 id="888" name="name" value="667"/>
        <tag6 id="999" name="context" value="FIX 5.0"/>
    </tag5>
</Model>
</dataroot>

xslt基本上完成了预期的工作。但是,有意外的变换:

<?xml version="1.0" encoding="UTF-8"?>
<dataroot version="2.0">
<Model id="111" name="test">
    <tag1 id="222" type="VERSION">
        <tag2 id="333" name="Version" value="2"/>
    </tag1>
    <tag3 id="444">
        <tag4 id="555" versionID="test/00001" name="name" definition="through test. &#13;&#10;" attrs="12 23"/>
        <tag4 id="666" versionID="test/00001" name="name" definition="through test 2. &#13;&#10;" messages="34 45"/>
    </tag3>
    <tag5 id="777" type="testtype">
        <tag6 id="888" name="value" value="667"/>
        <tag6 id="999" name="context" value="FIX 5.0"/>
    </tag5>
</Model>
</dataroot>

我想保留原始实体。 我已经尝试过disable-output-escape(请参阅xslt中带注释文本到@definition的注释部分),不起作用。有什么建议吗?

我使用xsltproc btw。

提前致谢!

1 个答案:

答案 0 :(得分:0)

似乎xslt无法处理这个要求,所以我在perl中做到了。 谢谢大家!