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>
            <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>

この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"/>

ここで、21、22、23、31、および24の各数値は、xmlファイル全体の要素bIdの値であり、最初のタグのような祖先にbId要素がない場合です。、変換を使用した後、変換は何も表示せず、出力ファイルの最初の行として「name」の値が空の行も表示されません。これを行う方法を知っている人はいますか?ご協力いただきありがとうございます。

4

1 に答える 1

0

問題はxsl:for-each にあります

<xsl:for-each select="sets/set/hP | sets/set/para/setP">   

特に、sets/set/hP xpath. これは、2 つのhP要素に一致します。最初は空なので、空の名前属性が生成されます。2 番目には 3 つのsetP要素が含まれていますが、実行name="{.//bId}"すると最初の要素のみが取得されます (この場合は bId = 22)。

したがって、xsl:for-eachをこれに変更することをお勧めします

<xsl:for-each select="sets/set/hP/sethP/setP | sets/set/para/setP"> 

setP要素がどのレベルで発生するか心配していない場合は、これを次のように単純化できます。

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

xsl:for-eachよりもxsl:apply-templatesを使用する方が、コードが読みやすくなり、インデントが減り、コードの再利用が容易になるため、しばしば好まれることに注意してください。

<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>
于 2012-07-29T11:44:42.867 に答える