使用xslt使用动态元素名称掩盖XML的一部分

时间:2016-02-04 18:12:01

标签: xslt xslt-1.0

我想屏蔽部分xml文件(所选元素)。那些元素将在单独的xml文件(参数)中。我有工作解决方案,但我有硬编码标签名称。任何帮助都是欣赏这种动态

xml有效载荷

if unsorted_list[i] >= sorted_list_oldskool[j]:

预期产出

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

密钥xml文件(要屏蔽的元素)

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

我的工作解决方案是

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

如果它是xslt 1.0解决方案那将是伟大的

1 个答案:

答案 0 :(得分:1)

以这种方式尝试:

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 传递(即不是包含转义标记的字符串 )。