繁体   English   中英

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

[英]XSLT 2.0: Check if string exists more than once in extern xml-file

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

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

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

其中变量SignalName包含我要搜索的字符串。 这样很好! 但是现在我还想检查一下,如果此字符串仅在SST文件中存在一次。 如果它不止一次存在,则应停止转换并显示错误,例如:“ SignalName在SST.xml中不止一次存在”,否则转换将正常进行。 有人可以告诉我该怎么做吗?

编辑:SST.xml中只有一个模块节点,但是SignalName存储在door / module / object / Object ___ Text节点中。 有几个对象节点。 无效的SignalNames也存储在door / module / object / Object ___ Text节点中。

我在代码中添加了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>

看起来像这样工作。 如果您发现一些可能的问题,请告诉我。

如果要检查至少有两个包含该字符串的module元素,则可以执行例如

<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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM