/ / xpath voliteľný atribút s vnútornými atribútmi - xml, xslt, xpath

voliteľný atribút xpath s vnútornými atribútmi - xml, xslt, xpath

Mám tento xml s vnoreným prvkom, ktorý je voliteľný, a musím vytvoriť súbor CSV s atribútmi z hierarchie, aj keď voliteľný atribút nie je prítomný.

tu je dátový súbor xml:

    <dataroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://mycomp.com/test/xml/model">
<ELEMENTS>
<COUNTRY cod_cnt="030">
<AS cod_as="030308">
<CONTRACT num_CONTRACT="8715167"/>
<CONTRACT num_CONTRACT="8715224"/>
</AS>
<AS cod_as="030309"/>
</COUNTRY>
</ELEMENTS>
</dataroot>

Potrebujem prvky, ktoré majú značku AS, aj keď má ZMLUVU alebo nie. „Napísal som niečo také, ale zasekol som sa:

<xsl:for-each select="/doc:dataroot/doc:ELEMENTS/doc:COUNTRY/doc:AS/doc:CONTRACT">
<xsl:value-of select="../../@cod_cnt"/>@<xsl:value-of select="../@cod_as"/>
@<xsl:value-of select="@num_CONTRACT"/>@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D<xsl:text> </xsl:text>
</xsl:for-each>

Viem, že mi chýba akýsi zväzok, ale nemôžem ísť ďalej.

Očakávam tento výstup:

030@030308@8715167@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D
030@030308@8715224@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D
030@030309@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D

všimnite si, že prvé dva riadky sú výstupom, ktorý som získal s pripojenými xls a tretí riadok je ručne napísaný, aby som vám ukázal výstup, ktorý očakávam.

odpovede:

0 pre odpoveď č. 1

Ak si ťa chcete nechať for-each štruktúra, mali by pre vás fungovať nasledujúce vyhlásenia. Najprv musíte iterovať doc:AS potom ďalej doc:CONTRACT Ak nejaký.

 <xsl:for-each select="/doc:dataroot/doc:ELEMENTS/doc:COUNTRY/doc:AS">
<xsl:value-of select="../@cod_cnt"/><xsl:text>@</xsl:text><xsl:value-of select="@cod_as"/>
<xsl:for-each select="doc:CONTRACT>
<xsl:text>@</xsl:text><xsl:value-of select="@num_CONTRACT"/>
</xsl:for-each>
<xsl:text>@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D</xsl:text>
</xsl:for-each>

Ale osobne radšej používam porovnávanie šablón a toto vo vašom prípade dá niečo také (netestované):

<xsl:template match="/">
<!-- Select the <doc:AS> if they are your "rows" in the csv output -->
<xsl:apply-template match="/doc:dataroot/doc:ELEMENTS/doc:COUNTRY/doc:AS"/>
</xsl:template>

<xsl:template match="doc:AS">
<!-- Do the job for the doc:AS -->
<xsl:value-of select="../@cod_cnt"/><xsl:text>@</xsl:text><xsl:value-of select="@cod_as"/>
<!-- Call template for doc:Contract if any -->
<xsl:apply-templates select="doc:Contract"/>
<!-- Then add the end of your row -->
<xsl:text>@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D</xsl:text>
</xsl:template>

<xsl:template match="doc:CONTRACT">
<!-- Do the job for doc:CONTRACT-->
<xsl:text>@</xsl:text><xsl:value-of select="@num_CONTRACT"/>
</xsl:template>