使用 xslt 使用动态元素名称屏蔽 XML 的一部分



我想屏蔽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(即不是作为包含转义标记的字符串(传递。

相关内容

  • 没有找到相关文章

最新更新