了
我想屏蔽xml文件的一部分(选定的元素(。 这些元素将位于单独的 XML 文件(参数(中。 我有有效的解决方案,但我有硬编码的标签名称。 任何帮助都值得赞赏,以使这种动态
XML 有效负载
<results>
<ready>yes</ready>
<student>
<accounts>
<boa>23423423423424</boa>
<dcu>345345353535</dcu>
</accounts>
<cardState>
<approved>true</approved>
<approvedacc>
<element>232323433233</element>
</approvedacc>
<refund>
<element>200</element>
</refund>
</cardState>
<cource>
<marks>
<element>A+</element>
</marks>
<total>
<element>20000</element>
</total>
</cource>
<created>true</created>
<firstName>john doe</firstName>
<ssn>123456</ssn>
</student>
</results>
预期产出
<results>
<ready>yes</ready>
<student>
<accounts>
****************
</accounts>
<cardState>
<approved>true</approved>
<approvedacc>
<element>232323433233</element>
</approvedacc>
<refund>
<element>200</element>
</refund>
</cardState>
<cource>
<marks>
<element>A+</element>
</marks>
<total>
<element>20000</element>
</total>
</cource>
<created>true</created>
<firstName>**********</firstName>
<ssn>123456</ssn>
</student>
</results>
密钥 XML 文件(要屏蔽的元素(
<keys>
<key>accounts</key>
<key>firstName</key>
</keys>
我的工作解决方案是
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:param name="mask" select="'********'"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//results/student/accounts/*">
<xsl:value-of select="$mask"/>
</xsl:template>
</xsl:stylesheet>
电流输出
<results>
<ready>yes</ready>
<student>
<accounts>****************</accounts>
<cardState>
<approved>true</approved>
<approvedacc>
<element>232323433233</element>
</approvedacc>
<refund>
<element>200</element>
</refund>
</cardState>
<cource>
<marks>
<element>A+</element>
</marks>
<total>
<element>20000</element>
</total>
</cource>
<created>true</created>
<firstName>john doe</firstName>
<ssn>123456</ssn>
</student>
</results>
如果是XSLT 1.0解决方案,那就太好
试试这个方式:
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="*"/>
<xsl:param name="path-to-keys" select="'keys.xml'"/>
<xsl:template match="*">
<xsl:copy>
<xsl:choose>
<xsl:when test="name()=document($path-to-keys)/keys/key">********</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
编辑:
上面假设您将keys.xml
文件的路径作为参数传递。如果参数是文件的内容,请尝试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="keys"/>
<xsl:template match="*">
<xsl:copy>
<xsl:choose>
<xsl:when test="name()=exsl:node-set($keys)/keys/key">********</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这是假设您传递参数的方法设法将keys.xml
文件的内容作为 XML(即不是作为包含转义标记的字符串(传递。