2015-07-10 88 views
0

我是xslt实现的新手,并想使用xslt进行xml-to-xml转换。我有以下的XML结构,多个层次,使用xslt掩盖xml元素

<GetData xmlns="http://www.hr-xml.org/3" releaseID="3.3"> 
<Application> 
    <Sender> 
     <ID>Person</ID> 
    </Sender> 
    <Receiver> 
     <Component>DataService</Component> 
    </Receiver> 
</Application> 
<CreationDateTime>2015-07-10</CreationDateTime> 
<DataArea> 
    <HRData> 
     <PersonDossier> 
      <MasterPerson> 
       <PersonID schemeID="MasterPersonId" schemeAgencyID="Agency">654321</PersonID> 
       <PersonLegalID schemeID="LegalID" schemeAgencyID="AgencyID">123456789</PersonLegalID> 
       <PersonName> 
        <FormattedName formatCode="GivenName, FamilyName">kjddfaad lsfjjo</FormattedName> 
        <GivenName>kjddfaad<GivenName> 
        <FamilyName>lsfjjo</FamilyName> 
       </PersonName> 
      </MasterPerson> 
     </MasterPersonDossier> 
    </HRData> 
</DataArea> 
</GetData> 

问题: 我想掩盖“PersonLegalID”元素,但整个XML的其余部分的价值已经被保存下来(我只想123456789被转换为***** 6789)。

有人可以为此提出一个xslt吗?我会进一步改进以符合我的要求。

+0

PersonLegalID中的值是否具有已知的固定长度? - P.S.请提供**格式正确的** XML输入;你的许多元素都没有正确关闭。 –

+0

是的,它是一个9个字符的长度值。 – Andy

回答

1

我想掩盖“PersonLegalID”元素,但其余的 整个XML已经被保存的值(我只想123456789是 转换为***** 6789)。

在这样的,你想要的是除了一些细节的所有内容复制的情况下,这是最好的开始与恒等变换模板的规则,然后添加例外覆盖它。

假设有问题的ID始终是9位长,你可以这样做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns3="http://www.hr-xml.org/3"> 
<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="ns3:PersonLegalID/text()"> 
    <xsl:value-of select="concat('*****', substring(., 6))"/> 
</xsl:template> 

</xsl:stylesheet> 

注意使用一个命名空间前缀,以解决PersonLegalID节点。

+0

非常感谢!我会尽力建立你的意见。 – Andy