如何检查子节点是否不存在?

时间:2018-09-07 10:59:05

标签: xml xslt xsd

我必须创建一个xslt才能对2个不同的xsd文件进行交叉,以便一个版本可以与另一个版本匹配。 我有一个带孩子的元素,其中一些孩子是可选的。在这种情况下。测试3是可选的。

<Test1>
    <TestA>data</TestA>
    <TestB>data</TestB>
    <TestC>data</TestC>
</Test1>
<Test2>
    <TestA>data</TestA>
    <TestC>data</TestC>
</Test2>

现在我想看看Testb是否存在,如果不存在,我必须在正确的位置(Testa和Testc之间)添加它。 请注意,Test1已经是其他元素的子元素,我使用xsl:for-each“联系”每个元素。

有没有办法做到这一点?谢谢!

1 个答案:

答案 0 :(得分:0)

要检查元素是否存在,可以使用xsl:ifxsl:when 与各自的test="element_name"

执行任务的示例脚本如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="*[matches(name(),'[a-z]+\d+','i')]">
    <xsl:copy>
      <xsl:variable name="curr" select="."/>
      <xsl:for-each select="('A','B','C')">
        <xsl:variable name="childName" select="concat('Test',.)"/>
        <xsl:variable name="elem" select="$curr/*[name() = $childName]"/>
        <xsl:element name="{$childName}">
          <xsl:choose>
            <xsl:when test="$elem">
              <xsl:value-of select="$elem"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>Surrogate value for </xsl:text>
              <xsl:value-of select="$childName"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:element>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

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

主要部分是与元素匹配的模板,其名称包括 字母(至少一个),然后是数字(至少一个)。

然后需要curr变量来保留当前元素,因为 for-each循环会对其进行更改,但我们仍然需要引用 外部当前元素。

For-each循环安排处理任何子 Test ... 元素, 名称以ABC结尾。

如果必需的子元素存在,则打印其值,否则 该脚本会打印相应的代理值。

可能这不是您需要的最终版本,但至少您有 一些创建最终版本的起点。