完整着色偶尔的行 XML 结构并在 HTML 中显示

Coloring occasional lines in full XML Structure and show in HTML

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

show XML in HTML with inline stylesheet

我希望这个问题不会立即被标记为重复,只是因为其中一位版主阅读了前两句话而忽略了其余部分。

问题不是在 HTML 中显示 XML 结构,而是显示完整的动态 XML 结构,包含所有标签和偶尔的彩色线条。 结构和内部字段是动态完整的,每个字段都可以是正确的或错误的,这取决于要比较的 xml 文件。 所以一个字段在第一次比较时是正确的,但在另一次比较时它是错误的。 XML 的字段和结构在一次比较和另一次比较中可能有很大差异。 从昨天开始我就在寻找相应的专业解决方案来解决这个问题。 后台进程:比较不同的 xml 文件,通过 java 中的 soa 微服务。比较由org.custommonkey.xmlunit进行。结果必须是一个 html 弹出窗口,它显示了用彩色线条标记的差异。

示例输出 XUnit 差异结果 XPath

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

通过 xslt 和 xunit diff 结果信息转换源 xml。

示例输入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 结构 AND彩色。 要么我没有得到标签,所以只能看到 XML 中的原始数据,没有标签,但是线条是彩色的。 或者我得到包含所有数据但未着色的 xml 结构。 我尝试替换xslt中的lt和gt字符,但是失败了,或者在java中转换后,这个结果非常难看。我同事的意思是我们不能以任何方式使用它。 因为 XML 结构每次都可以完全动态地不同,所以我不能用 css 和标签定义来设置 xml 的样式。 不幸的是,替代实现不是一种选择。我必须以我可用的方式以某种方式做到这一点。 (Java, XML & XSL, JS, HTML, CSS).

我希望得到解决这个问题的好主意。

先谢谢你了。

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

我。输入:

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

二.样式表 (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;

四.解释:

每当应用 mode="serialize" 时,上下文都会被转义。请参阅 CHANGED_BY 的示例以使用 HTML-标签进行格式化。 xml 结构已完全转义,因此浏览器将其显示为字符串而不是标签。

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