xslt为每个不工作

时间:2018-05-18 10:39:27

标签: xml xslt

XML

<MessageBody>
    <SerialNumbers>
        <cmn:Serial>010088202501033821100011946933</cmn:Serial>
        <cmn:Serial>010088202501033821100015310495</cmn:Serial>
        <cmn:Serial>010088202501033821100018139350</cmn:Serial>
        <cmn:Serial>010088202501033821100012121992</cmn:Serial>
        <cmn:Serial>010088202501033821100016483276</cmn:Serial>
        <cmn:Serial>010088202501033821100012414042</cmn:Serial>
        <cmn:Serial>010088202501033821100011320392</cmn:Serial>
        <cmn:Serial>010088202501033821100016102891</cmn:Serial>
        <cmn:Serial>010088202501033821100013578725</cmn:Serial>
        <cmn:Serial>010088202501033821100018119185</cmn:Serial>
    </SerialNumbers>

</MessageBody>

XSLT

    <xsl:for-each select="cmn:Serial">
    <fieldvalidation>
                <validtedfield>Serial</validtedfield>
                <value><xsl:value-of select="SerialNumbers/cmn:Serial"/></value>
        <xsl:choose>
            <xsl:when test="SerialNumbers/cmn:Serial != ''">    
                <status>Valid</status>
                <reason></reason>
            </xsl:when>
            <xsl:otherwise> 
                <status>Not Valid</status>
                <reason>Serial should not be empty.</reason>
            </xsl:otherwise>
        </xsl:choose>
    </fieldvalidation>
</xsl:for-each>

我试图转换转换,但我努力工作,我没有做任何错误转换工作正常的其他xml标签,但输出xml

没有显示的序列号

3 个答案:

答案 0 :(得分:1)

如果taskIdentifier处理for-each元素,则内部路径需要是相对的,因此要选择内部的每个元素而不是cmn:Serial,只需要<value><xsl:value-of select="SerialNumbers/cmn:Serial"/></value>而不是<value><xsl:value-of select="."/></value> test="SerialNumbers/cmn:Serial != ''"您只需要test=". != ''"

答案 1 :(得分:1)

嗨,最后我得到了正确答案

    <xsl:for-each select="//cmn:Serial">
    <fieldvalidation>
                <validtedfield>Serial</validtedfield>
                <value><xsl:value-of select="."/></value>
        <xsl:choose>
            <xsl:when test=".!= ''">    
                <status>Valid</status>
                <reason></reason>
            </xsl:when>
            <xsl:otherwise> 
                <status>Not Valid</status>
                <reason>Serial should not be empty.</reason>
            </xsl:otherwise>
        </xsl:choose>
    </fieldvalidation>
</xsl:for-each>

在循环内你必须像这样设置以获得所有的feild值。如果你这样设置,你将获得所有字段的值,该值等于第一个字段的值

答案 2 :(得分:0)

for-each select表达式需要您需要选择的节点列表的完全限定表达式,或者需要通配符选项来选择任何深度级别的所有表达式,如下所示。 这应该适合你:

xsl:for-each select="//cmn:Serial"