【问题标题】:check if specific value exists in xml record record with xslt使用 xslt 检查 xml 记录记录中是否存在特定值
【发布时间】:2018-09-01 11:52:22
【问题描述】:

我有一个问题,我需要检查我的 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>

基本上,一个 Person 可以包含多个就业期的就业元素。我需要检查记录 lart 及其代码属性的值是否为 0198,如果是这样,则该人不应映射到目标架构。

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

移除大部分人,但有些人会通过。我尝试了许多不同的方法,但 xslt 不是我的强项。

会不会是xslt代码只检查第一条Employment记录中的值?

非常感谢任何帮助。

【问题讨论】:

  • 您需要向我们展示两件事:(a) 一个可以复制问题的简化但完整的 XSLT 样式表; (b) 包含 XSLT 未能 过滤掉的条目的示例 XML。

标签: xml xslt mapping


【解决方案1】:

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

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

根据您的描述,听起来好像在您有一个具有多个就业/就业期间的人员节点的情况下,整个人员节点都将被抑制。

不确定您所说的“未映射”是什么意思,在这个有限的示例中,我认为它的意思是在输出中被省略。

【讨论】:

  • 感谢您的帮助,我尝试了此解决方案,但结果与以前相同。我试图计算代码属性值为 0198 的 lart 节点,以查看它们是否在哪里找到,是的,它们被计算在内,但人没有被省略。
猜你喜欢
  • 2011-02-20
  • 2021-02-21
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2012-08-13
相关资源
最近更新 更多