Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT 2.0:检查字符串在外部xml文件中是否存在多次_Xml_Xslt - Fatal编程技术网

XSLT 2.0:检查字符串在外部xml文件中是否存在多次

XSLT 2.0:检查字符串在外部xml文件中是否存在多次,xml,xslt,Xml,Xslt,我使用一个XSL样式表将两个XML文件转换为一个。 第一个:Main.xml 第二:SST.xml 我将样式表应用于main.xml,并希望检查第二个字符串中是否有某个字符串可用。 我正在使用 <xsl:when test="contains(document('SST.xml')/doors/module,$SignalName)"> 其中变量SignalName包含我要搜索的字符串。这个很好用! 但是现在我还要检查,这个字符串在SST文件中是否只存在一次。如果它存在不止一次

我使用一个XSL样式表将两个XML文件转换为一个。 第一个:Main.xml 第二:SST.xml

我将样式表应用于main.xml,并希望检查第二个字符串中是否有某个字符串可用。 我正在使用

<xsl:when test="contains(document('SST.xml')/doors/module,$SignalName)">

其中变量SignalName包含我要搜索的字符串。这个很好用! 但是现在我还要检查,这个字符串在SST文件中是否只存在一次。如果它存在不止一次,它应该停止转换并打印一个错误,如:“SignalName在SST.xml中存在不止一次”,否则转换将正常进行。 有人能告诉我怎么做吗

编辑: SST.xml中只有一个模块节点,但信号名存储在doors/module/object/object\文本节点中。有几个对象节点。 无效信号名也存储在doors/module/object/object\文本节点中

我在代码中添加了Martin Honnen的想法:

                    <xsl:choose>
                       <xsl:when test="contains(document('SST.xml')/doors/module,$SignalName)">  <!--Check if SST contains SignalName -->
                        <xsl:choose>
                            <xsl:when test="(document('SST.xml')/doors/module/object/Object___Text[contains(., $SignalName)])[2]"> <!-- Check if it contains SignalName more than once -->
                                <xsl:message terminate="yes" select="$SignalName"> exists more than once in SST.xml</xsl:message><!-- Abort and throw an error -->
                            </xsl:when>
                            <xsl:otherwise> <!-- Get Signal attributes -->
                                <L-4 L="EN"> 
                                    <TT><xsl:value-of select="concat('Signal_Type: ',document('SST.xml')/doors/module/object[Object___Text = $SignalName]/Signal_Type)"/></TT>
                                    <TT><xsl:value-of select="concat('Signal_Min: ',document('SST.xml')/doors/module/object[Object___Text = $SignalName]/Signal_Min)"/></TT>
                                    <TT><xsl:value-of select="concat('Signal_Max: ',document('SST.xml')/doors/module/object[Object___Text = $SignalName]/Signal_Max)"/></TT>
                                    <TT><xsl:value-of select="concat('Signal_Offset: ',document('SST.xml')/doors/module/object[Object___Text = $SignalName]/Signal_Offset)"/></TT>
                                    <TT><xsl:value-of select="concat('Signal_Resolution: ',document('SST.xml')/doors/module/object[Object___Text = $SignalName]/Signal_Resolution)"/></TT>
                                    <TT><xsl:value-of select="concat('SignalClass: ',document('SST.xml')/doors/module/object[Object___Text = $SignalName]/preceding-sibling::object[object_type='heading' and object_level='1'][1]/Object___Heading)"/></TT>
                                </L-4>
                            </xsl:otherwise>
                            </xsl:choose>
                          </xsl:when>
                          <xsl:otherwise> <!-- Signal doesn't exist in SST -->
                          <L-4 L="EN">
                          <TT>Signal was not found in SST</TT> 
                          </L-4>
                      </xsl:otherwise>
                  </xsl:choose>

在SST.xml中存在多次
SST中未发现信号

它似乎是这样工作的。如果您发现一些可能的问题,请告诉我。

如果您想检查是否至少有两个
模块
元素包含该字符串,则可以执行以下操作,例如

<xsl:if test="(document('SST.xml')/doors/module[contains(., $SignalName)])[2]">
  <xsl:message terminate="yes" select="'SignalName exists more than once in SST.xml'"/>
</xsl:if>


如果能看到这些文件的一个示例,例如是否可以有多个/doors/module元素?如果是这样,contains()将失败。您真的想要contains(),还是想要“=”?字符串的第二次出现(无效)是在任何地方,还是仅在模块元素中?请试着更仔细地表达你的问题。我已经在我的问题中添加了额外的信息。我希望现在一切都清楚了。我还添加了Martin Honnen的便条。它似乎工作得很好。不管怎样,谢谢你们,它不在模块中,但它很容易适应正确的路径。您还可以添加如何在输出注释中显示$SignalName的值吗?提前谢谢你!当然,您可以使用XPath和
concat
构造字符串。