xslt 1:检查节点是否包含列表中的任何值

xslt 1 : check if node contains any value from list

我需要将 XML 文档从一种格式转换为另一种格式,这就是花花公子。现在困难的部分是我需要检查所有行的状态代码,并且需要 return true/false 取决于任何代码元素是否具有任何此代码。

<xml>
  <line>
    <id>1</id>
    <code>109</code>
  </line>
  <line>
    <id>2</id>
    <code>065</code>
  </line>
  <line>
    <id>3</id>
    <code>405</code>
  </line>
  <line>
    <id>4</id>
    <code>101</code>
  </line>
</xml>

我转换的文档保留所有行元素的副本,但有一个额外的字段,设置为 true/false 取决于列表中是否有任何代码。

所以我需要将此数据列表与每个代码进行比较,如果列表中只有其中一个,则 return 为真 "101","102","103","104","105","106","107","108","109","110","111"

是否有任何修复模式可以使我不需要 11 compare stament?

哦,输出看起来像

<System>
  <Route>true</Route> <!-- will be false if the <code> from the first document is not in the list of elements -->
  <Status>
    <ID>1</ID>
    <Code>109</Code>
  </Status>
  <Status>
    <ID>2</ID>
    <Code>065</Code>
  </Status>
  <Status>
    <ID>3</ID>
    <Code>405</Code>
  </Status>
  <Status>
    <ID>4</ID>
    <Code>101</Code>
  </Status>
<System>

这个变换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:param name="pCodeList" select="'101,102,103,104,105,106,107,108,109,110,111'"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="/*">
    <System>
      <Route>
        <xsl:value-of select=
        "boolean(/*/*/code
                        [contains(concat(',', $pCodeList, ','), concat(',', ., ',')
                                  )
                        ]
                )"/>
      </Route>
      <xsl:apply-templates/>
    </System>
  </xsl:template>
  
  <xsl:template match="line">
    <Status><xsl:apply-templates/></Status>
  </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<xml>
    <line>
        <id>1</id>
        <code>109</code>
    </line>
    <line>
        <id>2</id>
        <code>065</code>
    </line>
    <line>
        <id>3</id>
        <code>405</code>
    </line>
    <line>
        <id>4</id>
        <code>101</code>
    </line>
</xml>

产生想要的正确结果:

<System>
   <Route>true</Route>
   <Status>
      <id>1</id>
      <code>109</code>
   </Status>
   <Status>
      <id>2</id>
      <code>065</code>
   </Status>
   <Status>
      <id>3</id>
      <code>405</code>
   </Status>
   <Status>
      <id>4</id>
      <code>101</code>
   </Status>
</System>

当相同的转换(上述)应用于此 XML 文档时:

<xml>
    <line>
        <id>1</id>
        <code>509</code>
    </line>
    <line>
        <id>2</id>
        <code>065</code>
    </line>
    <line>
        <id>3</id>
        <code>405</code>
    </line>
    <line>
        <id>4</id>
        <code>501</code>
    </line>
</xml>

它再次产生想要的正确结果:

<System>
   <Route>false</Route>
   <Status>
      <id>1</id>
      <code>509</code>
   </Status>
   <Status>
      <id>2</id>
      <code>065</code>
   </Status>
   <Status>
      <id>3</id>
      <code>405</code>
   </Status>
   <Status>
      <id>4</id>
      <code>501</code>
   </Status>
</System>