/ / Comment sélectionner le nom de l'élément, pas la valeur, en utilisant XSL / XSLT? - xslt, transformation

Comment sélectionner le nom de l'élément, pas la valeur, en utilisant XSL / XSLT? - xslt, transformation

Nous utilisons XSL pour convertir un fichier XML dans un format délimité par des tuyaux.

<?xml version="1.0" encoding="utf-8"?>
<ns:tradedata xmlns:ns="http://schemas.com/enterprise/util/extractservice/v1">
<tradedata_item>
<ORDER_ID>113632428</ORDER_ID>
<CUSIP>31393FHA7</CUSIP>
<TICKER>FHR</TICKER>
<SEC_NAME>FHR 2527 SG</SEC_NAME>
<ORDER_QTY>169249.6824</ORDER_QTY>
</tradedata_item>
<tradedata_item>
<ORDER_ID>113632434</ORDER_ID>
<CUSIP>31393G2C7</CUSIP>
<TICKER>FHR</TICKER>
<SEC_NAME>FHR 2531 ST</SEC_NAME>
<ORDER_QTY>214673.0105</ORDER_QTY>
</tradedata_item>
<tradedata_item>
<ORDER_ID>113632431</ORDER_ID>
<CUSIP>527069AH1</CUSIP>
<TICKER>LESL</TICKER>
<SEC_NAME>ZZZ_LESLIE S POOLMART INC</SEC_NAME>
<ORDER_QTY>365000.0000</ORDER_QTY>
</tradedata_item>
</ns:tradedata>

Nous avons besoin de la première ligne dans la sortie pour être les en-têtes de colonne, et tout le reste serait des données, comme ceci ...

ORDER_ID|CUSIP|TICKER|SEC_NAME|ORDER_QTY
1136324289|31393FHA7|FHR|FHR 2527 SG|169249.6824
1136324304|31393G2C7|FHR|FHR 2531 ST|214673.0105

Nous avons obtenu le XSL pour obtenir les données, mais nousne peut pas obtenir l'en-tête pour sortir correctement. Nous sélectionnons simplement le premier élément tradedata_item, puis itérons le nom de l'élément et les séparons en utilisant les caractères |. Voici le XSL complet ...

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl"
version="1.0" xmlns="http://schemas.com/enterprise/util/extractservice/v1"
xmlns:o="http://schemas.com/enterprise/util/extractservice/v1" >

<!--  xsl:strip-space elements="*"/-->
<xsl:output method="text" indent="no"/>

<xsl:template match="/tradedata/tradedata_item[1]">
<xsl:for-each select="*">
<xsl:value-of select="local-name()"/>|
</xsl:for-each>
<xsl:text>&#10;</xsl:text>
</xsl:template>


<xsl:template match="/">
<xsl:for-each select="tradedata/tradedata_item">
<xsl:value-of select="ORDER_ID"/>|<xsl:value-of select="CUSIP"/>|<xsl:value-of select="TICKER"/>|<xsl:value-of select="SEC_NAME"/>|<xsl:value-of select="ORDER_QTY"/>
<xsl:text>&#10;</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

La sortie que nous voyons n'est que des données, pas d'en-tête ...

113632428|31393FHA7|FHR|FHR 2527 SG|169249.6824
113632430|31393G2C7|FHR|FHR 2531 ST|214673.0105
113632431|527069AH1|LESL|ZZZ_LESLIE S POOLMART INC|365000.0000
113632434|38470RAD3|GRAHAM|ZZZ_GRAHAM PACKAGING CO|595000.0000

Veuillez ignorer les incohérences de l'espace de noms; J'ai dû masquer le xml et le xsl pour des raisons légales.

Réponses:

3 pour la réponse № 1

Essaye ça :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="no"/>

<xsl:template match="/">
<xsl:for-each select="tradedata/tradedata_item[1]/*">
<xsl:value-of select="concat(name(), "|")"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Sortie:

ORDER_ID|CUSIP|TICKER|SEC_NAME|ORDER_QTY|

Cela me semble assez simple. Peut-être que votre erreur est ailleurs.


0 pour la réponse № 2

J'ai essayé votre code .. J'ai seulement changé le premier modèle pour qu'il corresponde:

 <xsl:template match="//tradedata_item[1]">

et cela a fonctionné pour moi, c'est-à-dire obtenu les noms d'en-tête.


0 pour la réponse № 3
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl ofi"
version="1.0" xmlns="http://schemas.com/enterprise/util/extractservice/v1"
xmlns:ofi="http://schemas.oppen.com/enterprise/util/extractservice/v1">
<xsl:output method="text" indent="no"/>
<xsl:template match="tradedata_item[position()="1"]">
<xsl:for-each select="self::*">
<xsl:for-each select="child::*[position()!="5"]">
<xsl:value-of select="local-name(self::*)"/>|
</xsl:for-each>
<xsl:value-of select="local-name(child::*[position()="5"])"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="ORDER_ID"/>|<xsl:value-of select="CUSIP"/>|<xsl:value-of select="TICKER"/>|<xsl:value-of select="SEC_NAME"/>|<xsl:value-of select="ORDER_QTY"/>
<xsl:text>&#10;</xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template match="tradedata_item[position()&gt;1]">
<xsl:for-each select="self::*">
<xsl:value-of select="ORDER_ID"/>|<xsl:value-of select="CUSIP"/>|<xsl:value-of select="TICKER"/>|<xsl:value-of select="SEC_NAME"/>|<xsl:value-of select="ORDER_QTY"/>
<xsl:text>&#10;</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>