gpt4 book ai didi

java - 使用 XSLT 的 CDATA XML 屏蔽应返回相同的 XML,但屏蔽字段很少

转载 作者:行者123 更新时间:2023-12-01 11:58:21 24 4
gpt4 key购买 nike

我需要使用 XSLT 屏蔽 XML 中 CDATA 的 XML 中的几个字段。
因此,生成的 XML 应该与输入 XML 相同,但很少有文件被 XSLT 屏蔽。
我关注了this按预期屏蔽但生成 XML 的格式不同的链接。
我尝试了许多其他解决方案,它们几乎以与输入 XML 不同的其他格式输出新的 XML/HTML。
请检查以下示例以更好地理解。
输入带有 CDATA 内容的 XML。

<XML>
<LogLevel>info</LogLevel>
<Content><![CDATA[ <Msg>
<AccountNo>2701000098983</AccountNo>
<ApplName>Testing</ApplName>
</Msg>]]></Content>
<Date>20140909</Date>
</XML>

输出 XML 应该是:

   <XML>
<LogLevel>info</LogLevel>
<Content><![CDATA[ <Msg>
<AccountNo>XXXXXXXXXX983</AccountNo>
<ApplName>Testing</ApplName>
</Msg>]]></Content>
<Date>20140909</Date>
</XML>

编辑:
我使用了以下 XSLT

 <xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:choose>
<xsl:when test="contains(.,'&lt;AccountNo&gt;')">
<!-- This is the CDATA that I want to mask and write back out as CDATA -->
<xsl:variable name="tcontent">
<xsl:value-of
select="substring-after(substring-before(.,'&lt;/AccountNo&gt;'),'&lt;AccountNo&gt;') " />
</xsl:variable>
<xsl:text disable-output-escaping="yes">&lt;![CDATA[&lt;AccountNo&gt;</xsl:text>
<xsl:call-template name="maskVariable">
<xsl:with-param name="tvar" select="$tcontent" />
</xsl:call-template>
<xsl:text disable-output-escaping="yes">&lt;/AccountNo&gt;]]&gt;</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:copy />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="maskVariable">
<xsl:param name="tvar" />
<xsl:variable name="length" select="string-length($tvar)" />
<xsl:choose>
<xsl:when test="$length > 3">
<xsl:value-of
select="concat ('************', substring($tvar,$length - 1, 2))" />
</xsl:when>
<xsl:when test="$length > 1">
***
</xsl:when>
<xsl:otherwise />
</xsl:choose>
</xsl:template>

使用此 XSLT 的输出是:

<LogLevel>info</LogLevel>
<Content><![CDATA[<AccountNo>************02</AccountNo>]]></Content>
<Date>20140909</Date>

在输出中,仅显示 的屏蔽输出。
如何让代码的其他部分显示出来?请告诉我如何做?
非常感谢任何帮助。

最佳答案

你为什么不尝试一下:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="Content">
<xsl:copy>
<xsl:value-of select="substring-before(.,'&lt;AccountNo&gt;')" />
<xsl:text>&lt;AccountNo&gt;</xsl:text>
<xsl:variable name="acct-num" select="substring-before(substring-after(.,'&lt;AccountNo&gt;'), '&lt;/AccountNo&gt;')" />
<xsl:value-of select="concat('************', substring($acct-num, string-length($acct-num) - 2))" />
<xsl:text>&lt;/AccountNo&gt;</xsl:text>
<xsl:value-of select="substring-after(.,'&lt;/AccountNo&gt;')" />
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

应用到您的输入,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<XML>
<LogLevel>info</LogLevel>
<Content> &lt;Msg&gt;
&lt;AccountNo&gt;************983&lt;/AccountNo&gt;
&lt;ApplName&gt;Testing&lt;/ApplName&gt;
&lt;/Msg&gt;</Content>
<Date>20140909</Date>
</XML>
<小时/>

或者,您可以使用:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" cdata-section-elements="Content"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="Content">
<xsl:copy>
<xsl:variable name="content">
<xsl:value-of select="substring-before(.,'&lt;AccountNo&gt;')" />
<xsl:text>&lt;AccountNo&gt;</xsl:text>
<xsl:variable name="acct-num" select="substring-before(substring-after(.,'&lt;AccountNo&gt;'), '&lt;/AccountNo&gt;')" />
<xsl:value-of select="concat('************', substring($acct-num, string-length($acct-num) - 2))" />
<xsl:text>&lt;/AccountNo&gt;</xsl:text>
<xsl:value-of select="substring-after(.,'&lt;/AccountNo&gt;')" />
</xsl:variable>
<xsl:value-of select="$content" disable-output-escaping="yes"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

生产:

<?xml version="1.0" encoding="UTF-8"?>
<XML>
<LogLevel>info</LogLevel>
<Content><![CDATA[ <Msg>
<AccountNo>************983</AccountNo>
<ApplName>Testing</ApplName>
</Msg>]]></Content>
<Date>20140909</Date>
</XML>

尽管这可能不适用于所有处理器(经过测试可与 Xalan 2.7.1 配合使用: http://xsltransform.net/jyH9rMk )。

关于java - 使用 XSLT 的 CDATA XML 屏蔽应返回相同的 XML,但屏蔽字段很少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28184145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com