如何使用xslt获取元素的第四或第五个子元素的值

如何使用xslt获取元素的第四或第五个子元素的值,xslt,xslt-1.0,Xslt,Xslt 1.0,我使用以下XML源代码: <?xml version="1.0" encoding="UTF-8"?> <sets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="simulation-request.xsd"> <set> <hP /> <para> <setP>

我使用以下XML源代码:

<?xml version="1.0" encoding="UTF-8"?>
<sets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="simulation-request.xsd">
<set>
    <hP />
    <para>
        <setP>
            <nom1>acc</nom1>
            <nom2></nom2>
            <typ>T</typ>
            <oP>T_EQUALS</oP>
            <val1>40</val1>
            <bId>21</bId>
        </setP>
    </para>
    <issuers />
</set>
<set>
    <hP>
        <sethP>
            <hTyp>EX</hTyp>             
            <tFt>L_D</tFt>
            <tFv>1</tFv>
            <sCF>cd</sCF>
            <setP>
                <nom1>bount</nom1>
                <oP>NLO</oP>
                <val1>00</val1>
                <bId>22</bId>
            </setP>
            <setP>
                <nom1>bount</nom1>
                <oP>NLO</oP>
                <val1>00</val1>
                <bId>23</bId>
            </setP>
            <setP>
                <nom1>bount</nom1>
                <oP>NLO</oP>
                <val1>00</val1>
                <bId>31</bId>
            </setP>

        </sethP>
    </hP>
    <para>
        <setP>
            <nom1>bount</nom1>
            <nom2></nom2>
            <typ>LO</typ>
            <oP>T_C</oP>
            <val1>1</val1>
            <bId>24</bId>
        </setP>
    </para>
    <issuers />
</set>  
</sets>

行政协调会
T
T_等于
40
21
前任
卢德
1.
光盘
慷慨
非直瞄
00
22
慷慨
非直瞄
00
23
慷慨
非直瞄
00
31
慷慨
瞧
图克
1.
24
使用此XSLT源:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"   xml:space="preserve"/>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/"><xsl:text>&#10;</xsl:text>   
    <xsl:for-each select="sets/set/hP | sets/set/para/setP">            
            <com-set-cond b.name="netInternalMs" name="{.//bId}">
            </com-set-cond><xsl:text>&#10;</xsl:text>
        </xsl:for-each>
</xsl:template>


   


输出结果如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<com-set-cond b.name="netInternalMs" name=""/>
<com-set-cond b.name="netInternalMs" name="21"/>
<com-set-cond b.name="netInternalMs" name="22"/>
<com-set-cond b.name="netInternalMs" name="24"/>
<?xml version="1.0" encoding="UTF-8"?>

<com-set-cond b.name="netInternalMs" name="21"/>
<com-set-cond b.name="netInternalMs" name="22"/>
<com-set-cond b.name="netInternalMs" name="23"/>
<com-set-cond b.name="netInternalMs" name="31"/>
<com-set-cond b.name="netInternalMs" name="24"/>

但预期输出必须如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<com-set-cond b.name="netInternalMs" name=""/>
<com-set-cond b.name="netInternalMs" name="21"/>
<com-set-cond b.name="netInternalMs" name="22"/>
<com-set-cond b.name="netInternalMs" name="24"/>
<?xml version="1.0" encoding="UTF-8"?>

<com-set-cond b.name="netInternalMs" name="21"/>
<com-set-cond b.name="netInternalMs" name="22"/>
<com-set-cond b.name="netInternalMs" name="23"/>
<com-set-cond b.name="netInternalMs" name="31"/>
<com-set-cond b.name="netInternalMs" name="24"/>

其中,21、22、23、31和24的每个数字都是整个xml文件中元素bId的值,并且当像第一个标记这样的祖先中没有bId元素时,我的转换将不会显示任何内容,也不会显示“name”值为空的行作为使用我的转换后输出文件中的第一行
有人知道怎么做吗?感谢您的帮助。

问题在于您的xsl:for each

<xsl:for-each select="sets/set/hP | sets/set/para/setP">   
如果您不担心您的setP元素出现的级别,您可以将其简化为以下内容

<xsl:for-each select=".//setP">

请注意,通常首选使用xsl:apply templates而不是xsl:for each,因为这样可以使代码更可读,减少缩进,并且更易于重用代码

<xsl:template match="/">
    <xsl:text>&#10;</xsl:text>    
    <xsl:apply-templates select=".//setP" /> 
</xsl:template> 

<xsl:template match="setP">
   <com-set-cond b.name="netInternalMs" name="{.//bId}" />
   <xsl:text>&#10;</xsl:text>  
</xsl:template>


    

  

感谢您的帮助,Tim,我现在得到了预期的输出,并使用了“应用模板”示例。谢谢。弗兰基