Xml XSLT for each无法提取值

Xml XSLT for each无法提取值,xml,xslt,transformation,Xml,Xslt,Transformation,我正在尝试使用xslt将xml转换为所需的xml。但是我不能正确地使用for-each,值返回null。任何人都可以帮助进行xslt转换 这是你的电话号码 我正在使用的XSLT <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/&

我正在尝试使用xslt将xml转换为所需的xml。但是我不能正确地使用for-each,值返回null。任何人都可以帮助进行xslt转换

这是你的电话号码 我正在使用的XSLT

<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <INB>
            <SEG>
                <TRN>RAN</TRN>
                <VER>8.3</VER>
                <WHS>699</WHS>
                <xsl:for-each select="message/Lines">
                    <LINE>
                        <SENAM>LINE_SEG</SENAM>
                        <INVSLN>0</INVSLN>
                        <EXPQTY>0</EXPQTY>
                        <xsl:if test="not(normalize-space(message/Lines/Nbr)) = ''">
                            <NUM>
                                <xsl:value-of select="normalize-space(message/Lines/Nbr)"/>
                            </NUM>
                        </xsl:if>
                        <STS>A</STS>
                        <PRT>----</PRT>
                    </LINE>
                </xsl:for-each> 
            </SEG>
        </INB>
    </xsl:template>
</xsl:stylesheet>

跑
8.3
699
线路分段
0
0
A.
----
以下是输入XML:

<message>
    <PoNbr>451617926</PoNbr>
    <whCode/>
    <unitCode/>
    <dnrbTime/>
    <Lines>
        <Nbr>451617926</Nbr>
    </Lines>
    <Lines>
        <Nbr>2</Nbr>
    </Lines>
</message>
<INB>
    <SEG>
        <TRN>RAN</TRN>
        <VER>8.3</VER>
        <WHS>699</WHS>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM/>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM/>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
    </SEG>
</INB>
<INB>
    <SEG>
        <TRN>RAN</TRN>
        <VER>8.3</VER>
        <WHS>699</WHS>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM>451617926</NUM>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM>2</NUM>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
    </SEG>
</INB>

451617926
451617926
2.
下面是它返回的输出

在下面返回的输出中,没有使用for-each语句映射的Nbr

输出:

<message>
    <PoNbr>451617926</PoNbr>
    <whCode/>
    <unitCode/>
    <dnrbTime/>
    <Lines>
        <Nbr>451617926</Nbr>
    </Lines>
    <Lines>
        <Nbr>2</Nbr>
    </Lines>
</message>
<INB>
    <SEG>
        <TRN>RAN</TRN>
        <VER>8.3</VER>
        <WHS>699</WHS>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM/>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM/>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
    </SEG>
</INB>
<INB>
    <SEG>
        <TRN>RAN</TRN>
        <VER>8.3</VER>
        <WHS>699</WHS>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM>451617926</NUM>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM>2</NUM>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
    </SEG>
</INB>

跑
8.3
699
线路分段
0
0
A.
----
线路分段
0
0
A.
----
预期输出:

<message>
    <PoNbr>451617926</PoNbr>
    <whCode/>
    <unitCode/>
    <dnrbTime/>
    <Lines>
        <Nbr>451617926</Nbr>
    </Lines>
    <Lines>
        <Nbr>2</Nbr>
    </Lines>
</message>
<INB>
    <SEG>
        <TRN>RAN</TRN>
        <VER>8.3</VER>
        <WHS>699</WHS>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM/>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM/>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
    </SEG>
</INB>
<INB>
    <SEG>
        <TRN>RAN</TRN>
        <VER>8.3</VER>
        <WHS>699</WHS>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM>451617926</NUM>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
        <LINE>
            <SENAM>LINE_SEG</SENAM>
            <INVSLN>0</INVSLN>
            <EXPQTY>0</EXPQTY>
            <NUM>2</NUM>
            <STS>A</STS>
            <PRT>----</PRT>
        </LINE>
    </SEG>
</INB>

跑
8.3
699
线路分段
0
0
451617926
A.
----
线路分段
0
0
2.
A.
----

我调整了所有XPath表达式。看看吧

XSLT


跑
8.3
699
线路分段
0
0
A.
----
输出XML


跑
8.3
699
线路分段
0
0
451617926
A.
----
线路分段
0
0
2.
A.
----

我调整了所有XPath表达式。看看吧

XSLT


跑
8.3
699
线路分段
0
0
A.
----
输出XML


跑
8.3
699
线路分段
0
0
451617926
A.
----
线路分段
0
0
2.
A.
----

仅更改以下代码

<xsl:if test="not(normalize-space(message/Lines/Nbr)) = ''">

改为

<xsl:if test="not(normalize-space(message/Lines/Nbr)='')">

仅更改以下代码

<xsl:if test="not(normalize-space(message/Lines/Nbr)) = ''">

改为

<xsl:if test="not(normalize-space(message/Lines/Nbr)='')">


还需要修复主要缺陷;主要错误是无法理解
xsl:for each
更改上下文的常见错误。还需要修复主要错误;主要缺陷是无法理解
xsl:for each
更改了上下文。此解决方案无法修复@ajeetingh在
test
表达式中指出的错误。表达式
not(规范化空间(Nbr))
在此数据集上返回false。在XPath 2.0下,将false与“”进行比较是一个错误,但在XPath 1.0下返回true。所以它(在这个数据上)是偶然工作的——这是一个典型的例子,说明了为什么XPath 2.0中更强大的类型检查是可取的。有些人不喜欢隐式string->boolean转换,我也不喜欢,但这个习惯用法非常常见和方便,我很乐意使用它。Saxon对其进行了优化—它实际上并不构造规范化字符串,只是测试是否存在任何非空格字符。此解决方案无法修复@Ajeetingh在
测试
表达式中指出的错误。表达式
not(规范化空间(Nbr))
在此数据集上返回false。在XPath 2.0下,将false与“”进行比较是一个错误,但在XPath 1.0下返回true。所以它(在这个数据上)是偶然工作的——这是一个典型的例子,说明了为什么XPath 2.0中更强大的类型检查是可取的。有些人不喜欢隐式string->boolean转换,我也不喜欢,但这个习惯用法非常常见和方便,我很乐意使用它。Saxon对其进行了优化——它实际上并没有构造规范化字符串,只是测试是否存在任何非空格字符。