使用xslt检查xml记录中是否存在特定值

时间:2018-03-22 21:36:01

标签: xml xslt mapping

我有一个问题,我需要检查我的xml中是否存在特定值。如果该值存在,则该记录不应映射到目标模式。 xml和xsd非常大,所以我会尝试简化它,它看起来像这样。

简化的xml:

<ns0:Root xmlns:ns0="http://Schema1">
 <Person>
   <Employment>
     <EmploymentPeriod>
          <lart code="0674" />
     </EmploymentPeriod>
     <EmploymentPeriod>
          <lart code="2222" />
     </EmploymentPeriod>
   </Employment>
   <Employment>
     <EmploymentPeriod>
          <lart code="0198" />
     </EmploymentPeriod>
   </Employment>
 </Person>
 <Person>
   <Employment>
     <EmploymentPeriod>
          <lart code="0133" />
     </EmploymentPeriod>
   </Employment>
  </Person>
</ns0:Root>

基本上,一个人可以包含多个具有多个就业期的就业要素。我需要检查记录lart及其代码属性是否具有值0198,如果那样,那个人不应该映射到目标模式。

    <xsl:if test="ns0:Employment/ns0:EmploymentPeriod/ns0:lart[@code=0198]">

删除大部分人,但有些人通过。我尝试了很多不同的方法,但xslt不是我强大的一面。

可能是xslt代码只检查第一份就业记录中的值吗?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

不确定这是否正是您所寻找的,但可能会给您一个大致的想法。这个样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">


<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>


<xsl:template match="Person[descendant::lart[@code=0198]]">
    <xsl:comment>Do not map person with lart/@code = 0198</xsl:comment>
</xsl:template>

</xsl:stylesheet>

生成这个xml:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Root xmlns:ns0="http://Schema1">
    <!--Do not map person with lart/@code = 0198-->
    <Person>
        <Employment>
            <EmploymentPeriod>
                <lart code="0133"/>
            </EmploymentPeriod>
        </Employment>
    </Person>
</ns0:Root>

根据你的描述,它听起来像你有一个具有多个Employment / EmploymentPeriods的Person节点的情况,整个Person节点将被抑制。

不确定你的意思是什么&#34;没有映射&#34;,在这个有限的例子中,我认为它意味着在输出中被省略。