我正在使用XSL-Stylesheet将2个XML文件转换为一个。 第一个:Main.xml 第二名:SST.xml
我在main.xml上应用样式表,并想检查第二个字符串是否可用。 我正在使用
<xsl:when test="contains(document('SST.xml')/doors/module,$SignalName)">
其中变量SignalName包含我要搜索的字符串。这很好用! 但是现在我还想检查一下,如果这个字符串在SST文件中只存在ONCE。如果它不止一次存在,它应该停止转换并打印一个错误,如:“SignalName在SST.xml中存在多次”,否则转换正常进行。 有人可以告诉我怎么做吗?
编辑: SST.xml中只有一个模块节点,但SignalName存储在doors / module / object / Object ___ Text Node中。有几个对象节点。 无效的SignalNames也存储在doors / 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>
它似乎像这样工作。如果你看到一些可能的问题,请告诉我。
答案 0 :(得分:0)
如果要检查至少有两个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>