着色在HTML完整的XML结构和偶尔显示线(Coloring occasional lines in

2019-10-29 18:09发布

我的第一个问题被标记为复制,但它不是一个重复

显示HTML与XML内嵌样式表

我希望这个问题不immediatley标记为重复的,只是因为主持人的一个读了前两句and've忽略了休息。

问题是不显示HTML中的XML结构,而表现出一个完整的动态XML结构,所有的标签和偶尔的彩色线条。 结构和内部田野里全是动态的,每场可以是正确的或错误的,这取决于xml文件喜欢比较。 所以一个场是在第一比较正确的,但在另一个比较这是错的。 XML的字段和结构可以由一个比较到另一个变化很大。 因为昨天我在寻找这个问题的对应和专业的解决方案。 后台进程:比较不同的XML文件,通过在Java的SOA微服务。 比较被org.custommonkey.xmlunit制成。 其结果必须是一个HTML弹出,我有什么显示了彩色线条明显的差异。

示例输出的xUnit DIFF结果的XPath

/ROOT[1]/MATDETAIL[1]/OUTPUT[1]/GENERAL[1]/CHANGED_BY[1]/text()[1]

通过XSLT转换源XML和的xUnit差异导致信息。

示例输入XML

<ROOT>    
      <MATDETAIL>
            <OUTPUT>
                  <GENERAL>
                        <CREATED_ON/>
                        <CREATED_BY>ORIGINAL USER</CREATED_BY>
                        <LAST_CHNGE/>
                        <CHANGED_BY>NEW USER</CHANGED_BY>
                  </GENERAL>
                  <RETURN>
                        <TYPE>S</TYPE>
                        <MESSAGE/>
                        <LOG_NO/>
                        <LOG_MSG_NO>000000</LOG_MSG_NO>
                  </RETURN>
            </OUTPUT>
      </MATDETAIL>  
</ROOT>

例如XSL转换

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" mode="unescape"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/ROOT[1]/MATDETAIL[1]/OUTPUT[1]/GENERAL[1]/CHANGED_BY[1]">

    <xsl:element name = "span">
        <xsl:attribute name="style">font-weight:bold; color:red </xsl:attribute>
        <xsl:copy>
            <xsl:value-of select = "current()" />
        </xsl:copy>
        <xsl:text>&lt;== Expected: dasda</xsl:text>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

XSL转换的示例结果

<ROOT>    
      <MATDETAIL>
            <OUTPUT>
                  <GENERAL>
                        <CREATED_ON/>
                        <CREATED_BY>ORIGINAL USER</CREATED_BY>
                        <LAST_CHNGE/>
                        <span style="font-weight:bold; color:red "><CHANGED_BY>NEW USER</CHANGED_BY>&lt;== Expected: ORIGINAL USER</span>
                  </GENERAL>
                  <RETURN>
                        <TYPE>S</TYPE>
                        <MESSAGE/>
                        <LOG_NO/>
                        <LOG_MSG_NO>000000</LOG_MSG_NO>
                  </RETURN>
            </OUTPUT>
      </MATDETAIL>  
</ROOT>

我不能在HTML显示此XML结构,(所有)标签 ,正确有色。 要么我已经拿不出标签,所以只有在XML的原始数据来看,没有标签,但线的颜色。 或者我得到的XML结构的所有数据,但不着色。 我试图取代内部XSLT的LT和GT字符,但失败了,或者Java转换后,这一结果显示出非常难看。 我的同事也意味着,我们不能以任何方式使用它。 由于XML Structur可每一次不同等完全动态的,我不能风格的CSS和标签定义的XML。 不幸的是,替代实施方案不是一个选项。 我必须与提供给我的手段以某种方式做到这一点。 (Java,XML和XSL,JS,HTML,CSS)。

我希望能得到好的想法溶质这一点。

我想感谢你在前进。

Answer 1:

我希望我可以尝试以下解决您的问题。

一,输入:

<ROOT baum="baum">    
    <MATDETAIL>
        <OUTPUT>
            <GENERAL>
                <CREATED_ON/>
                <CREATED_BY>ORIGINAL USER</CREATED_BY>
                <LAST_CHNGE/>
                <CHANGED_BY>NEW USER</CHANGED_BY>
            </GENERAL>
            <RETURN>
                <TYPE>S</TYPE>
                <MESSAGE/>
                <LOG_NO/>
                <LOG_MSG_NO>000000</LOG_MSG_NO>
            </RETURN>
        </OUTPUT>
    </MATDETAIL>  
</ROOT>

II。 样式表(XSLT 1.0):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="CHANGED_BY">
        <span style="color:red;">
            <xsl:apply-templates select="." mode="serialize"/>
        </span>
    </xsl:template>

    <xsl:template match="*">
        <xsl:apply-templates select="." mode="serialize"/>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:apply-templates select="." mode="serialize"/>
    </xsl:template>

    <xsl:template match="*" mode="serialize">
        <xsl:value-of select="concat('&lt;', name())"/>
        <xsl:apply-templates select="@*" />
        <xsl:choose>
            <xsl:when test="node()">
                <xsl:text>&gt;</xsl:text>
                <xsl:apply-templates />
                <xsl:value-of select="concat('&lt;', name(), '&gt;')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text> /&gt;</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="@*" mode="serialize">
        <xsl:value-of select="concat(' ', name(), '=&quot;', ., '&quot;')"/>
    </xsl:template>

    <xsl:template match="text()" mode="serialize">
        <xsl:value-of select="."/>
    </xsl:template>

</xsl:stylesheet>

三:输出:

&lt;ROOT baum="baum"&gt;    
    &lt;MATDETAIL&gt;
        &lt;OUTPUT&gt;
            &lt;GENERAL&gt;
                &lt;CREATED_ON /&gt;
                &lt;CREATED_BY&gt;ORIGINAL USER&lt;/CREATED_BY&gt;
                &lt;LAST_CHNGE /&gt;
                <span style="color:red;">&lt;CHANGED_BY&gt;NEW USER&lt;/CHANGED_BY&gt;</span>
            &lt;/GENERAL&gt;
            &lt;RETURN&gt;
                &lt;TYPE&gt;S&lt;/TYPE&gt;
                &lt;MESSAGE /&gt;
                &lt;LOG_NO /&gt;
                &lt;LOG_MSG_NO&gt;000000&lt;/LOG_MSG_NO&gt;
            &lt;/RETURN&gt;
        &lt;/OUTPUT&gt;
    &lt;/MATDETAIL&gt;  
&lt;/ROOT&gt;

IV。 说明:

每当mode="serialize"被施加,上下文被转义。 示例见CHANGED_BY与HTML标签的格式。 该XML结构完全逃脱这样的浏览器显示它像一个字符串,而不是标签。

我真的希望它解决了你的问题



文章来源: Coloring occasional lines in full XML Structure and show in HTML