【发布时间】:2016-03-08 08:40:21
【问题描述】:
谁能帮我屏蔽 Datapower 中的非 XML 输入。
我首先在 Datapower 日志存储中记录输入并将该输入用于掩码,我编写了一段适用于 XML 但不适用于非 XML 的代码,
附上我的输入非 XML 和代码以供参考。
附加的掩码file.xsl 有两个模板,一个用于非 XML,另一个用于 XML。 XML 适用于数值并且不屏蔽字符。
调用了非 XML 模板但不进行屏蔽。(我可以在系统日志中看到它正在被调用)
赋予屏蔽模板的控制权由附加的不同log.xml 文件提供。
感谢快速响应。 谢谢, 阿努杰
输入非 xml。 PCTM-ODS-MTRF-WRSP-RSP PCTM-ODS-MTRF-WRSP-RSP 0200000298111 00000000ODS00000000000000834978953 00LIQ055003241NYYNYNNY 10000020130823Y000000000018765-000000000018765-000000000018765-010000100000000000000000000000-000000000000000-000000000000000 -
LI>我的代码:下面的 maskFldName 是从 log.xml 文件中调用的。
<xsl:template name="NONXMLmaskingTemplate">
<xsl:param name="maskFldName"/>
<xsl:param name="Input"/>
<xsl:variable name="maskchars" select="'******************************'"/>
<xsl:message>maskFldName:<xsl:copy-of select="$maskFldName"/>
</xsl:message>
<xsl:variable name="logInput">
<!--<dp:serialize select="$Input" omit-xml-decl="yes"/>-->
<xsl:copy-of select="translate($Input,'" : "','":"')"/>
</xsl:variable>
<xsl:message>MaskInputMessage:<xsl:copy-of select="$logInput"/>
</xsl:message>
<dp:set-local-variable name="'var://local/input'" value="$logInput"/>
<xsl:message>!!!!
<xsl:copy-of select="translate($Input,' ','')"/>
</xsl:message>
<xsl:for-each select="$maskFldName">
<xsl:variable name="startPosition" select="./@startPosition"/>
<xsl:variable name="noOfChars" select="./@numOfChars"/>
<xsl:message>startPosition:<xsl:value-of select="$startPosition"/>
</xsl:message>
<xsl:message>noOfChars:<xsl:value-of select="$noOfChars"/>
</xsl:message>
<xsl:variable name="maskString" select="substring($maskchars,1,$noOfChars)"/>
<xsl:message>Matches:<xsl:copy-of select="regexp:match($logInput,.,'g')"/>
</xsl:message>
<xsl:message>InputMessage1:<xsl:copy-of select="$Input"/>
</xsl:message>
<xsl:for-each select="regexp:match($logInput,.,'g')">
<xsl:message>InputMessage:<xsl:copy-of select="$logInput"/>
</xsl:message>
<xsl:message>ValueX:<xsl:copy-of select="."/>
</xsl:message>
<xsl:variable name="strToReplace" select="substring(.,$startPosition,$noOfChars)"/>
<xsl:variable name="strToReplace2" select="regexp:replace(.,$strToReplace,'g',$maskString)"/>
<xsl:message>strToReplace:<xsl:copy-of select="$strToReplace"/>
</xsl:message>
<xsl:message>strToReplace2:<xsl:value-of select="$strToReplace2"/>
</xsl:message>
<dp:set-local-variable name="'var://local/input'" value="regexp:replace(dp:local-variable('var://local/input'),.,'g',$strToReplace2)"/>
</xsl:for-each>
</xsl:for-each>
<xsl:copy-of select="dp:local-variable('var://local/input')"/>
<!--
If message to be proper xml i.e. < needs to be output as < then the following code to be used
<xsl:copy-of select="dp:transform('detailLog.xsl',dp:parse(dp:local-variable('var://local/input')))"/>
<xsl:message>MaskOutputMessage:<xsl:copy-of select="dp:local-variable('var://local/input')"/> </xsl:message>
-->
</xsl:template>
</xsl:stylesheet>
- log.xml
<?xml version="1.0" encoding="UTF-8"?>
<logConfig>
<!-- ALL/NONE/FRONT/BACK -->
<log-enabled value="ALL"/>
<!-- Y/N -->
<detail-log-enabled value="Y"/>
<!-- Y/N -->
<slim-log-enabled value="N"/>
<masking isMaskRequire="Y">
<logpoint id="service_req_entry">
<contentType>NONXML</contentType>
<maskPattern attribute="detail" startPosition="50" numOfChars="4">(PCTM[\w])</maskPattern>
</logpoint>
<logpoint id="SCRq-out">
<contentType>XML</contentType>
<maskPattern attribute="detail" startPosition="11" numOfChars="4">(Severity>[\w]+<)</maskPattern>
</logpoint>
</masking>
</logConfig>
【问题讨论】:
-
如果输入不是 XML,您应该考虑根本不使用 XSLT。在 XSLT 2.0 中,
unparsed-text()可以在没有标记的情况下读取文本 - 但有时,使用另一种语言(如 shellscript、Perl、Python、PHP 等)会更容易。 -
您好 Mathias,感谢您的建议,但我的要求是使用 eXSLT 正则表达式函数来屏蔽上述非 xml 数据。任何帮助都会很棒。
-
@AK.DataPower 如果您的输入不是 XML 文件,那么 XSLT 1.0 根本无法读取它。也许您可以通过其他方式(例如作为参数)将其传递给样式表。
-
处理非 XML 数据的一种方法是使用 XML 标记包装文档以生成格式良好的伪 XML usinf 平面文件描述符,然后可以使用 XSLT 进一步处理生成的文档。查看以下链接以获取详细信息www-01.ibm.com/support/docview.wss?uid=swg21321379
标签: xslt ibm-datapower