[英]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.