我是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中没有办法打破循环,但是有没有更简单的方法来实现我在这里尝试做的事情?
答案 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