XSLT:只为条件

时间:2018-01-16 08:28:18

标签: xml xslt

我是XSLT的新手,我必须在现有的XSLT文件中进行一些更改。

我有以下示例xml:

<?xml version="1.0" encoding="utf-8"?>
<Item>
  <SubItems>
    <SubItem>
      <InnerItem>
        <ValueToSearch>XYZ</ValueToSearch>
        <Level>0</Level>
        <InnerItem>
          <ValueToSearch>Value1</ValueToSearch>
          <Level>1</Level>
          <InnerItem>
            <ValueToSearch>ABC</ValueToSearch>
            <Level>2</Level>
            <InnerItem>
              <ValueToSearch>Value2</ValueToSearch>
              <Level>3</Level>
            </InnerItem>
          </InnerItem>
        </InnerItem>
      </InnerItem>
      <InnerItem>
        <ValueToSearch>IJK</ValueToSearch>
        <Level>0</Level>
      </InnerItem>
      <InnerItem>
        <ValueToSearch>Value3</ValueToSearch>
        <Level>0</Level>
        <InnerItem>
          <ValueToSearch>HYT</ValueToSearch>
          <Level>1</Level>
        </InnerItem>
      </InnerItem>
    </SubItem>
  </SubItems>
</Item>

在上面的XML中,我想遍历所有<InnerItem>标记(包括嵌套的标记)并读取值<ValueToSearch>标记值并检查它是否存在于变量中具有多个空格分隔值。我的XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes" />
  <xsl:variable name="List" select="'Value1 Value2 Value3'"></xsl:variable>
  <xsl:template match="/">
    <xsl:for-each select="//Item/SubItems/SubItem">
        <xsl:for-each select=".//InnerItem[contains( concat(' ', $List, ' '), concat(' ', ValueToSearch , ' '))]">
            <Value>
              <xsl:value-of select="ValueToSearch"/>
            </Value>
        </xsl:for-each>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

在上面的XSLT中,所有<InnerItem>标记(包括嵌套的标记)都已循环通过,<ValueToSearch>搜索标记的值如果存在于{{1变量哪个工作正常。

我的问题是,$List标记中存在两个匹配值,<ValueToSearch>标记的正文运行两次。如果for-each标记的XML中有更多匹配值,则循环体将运行很多次。

当前输出:

<ValueToSearch>

预期产出:

<?xml version="1.0" encoding="utf-8"?>
<ValueToSearch>Value1</ValueToSearch>
<ValueToSearch>Value2</ValueToSearch>
<ValueToSearch>Value3</ValueToSearch>

我的要求是,如果找到匹配值,只需添加另一个<?xml version="1.0" encoding="utf-8"?> <ValueToSearch>Value1</ValueToSearch> 只运行for-each标记的正文,这对于所有匹配值只会满足一次。我知道在XSLT中没有办法打破循环,但是有没有更简单的方法来实现我在这里尝试做的事情?

1 个答案:

答案 0 :(得分:1)

听起来好像你只想处理

Sub Limit_Def()

LimitUpdate = MsgBox("Would you like to keep the distance limit the same throughout?", vbYesNo)

If LimitUpdate = vbYes Then

    LimitNow = MsgBox("Would you like to choose your limit now?", vbYesNo)

        If LimitNow = vbYes Then

                Limit = InputBox("Please set a line distance limit")

        Else

        End If
End If



Call Calculate_Angle

End Sub

即您的条件所适用的第一个<xsl:for-each select="(.//InnerItem[contains( concat(' ', $List, ' '), concat(' ', ValueToSearch , ' '))])[1]">

此外,您似乎只需要一个InnerItem,而不是两个嵌套的,所以

for-each

http://xsltfiddle.liberty-development.net/jyyiVhk/1