Как выбрать имя элемента, а не значение, используя XSL / XSLT? - PullRequest
0 голосов
/ 29 сентября 2011

Мы используем XSL для преобразования XML-файла в формат с разделителями.

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

Нам нужно, чтобы первая строка в выводе была заголовками столбцов, а все остальное было бы данными, как это ...

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

У нас есть XSLработает, чтобы получить данные, но мы не можем заставить заголовок правильно выводить.Мы просто выбираем первый элемент tradedata_item, затем итерируем имя элемента и разделяем их, используя |персонажи.Вот полный XSL ...

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

Вывод, который мы видим, это просто данные, без заголовка ...

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

Пожалуйста, не обращайте внимания на любые несоответствия в пространстве имен;Мне пришлось запутать xml и xsl по юридическим причинам.

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

Попробуйте:

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

Вывод:

ORDER_ID|CUSIP|TICKER|SEC_NAME|ORDER_QTY|

Мне кажется, это довольно просто.Может быть, ваша ошибка лежит в другом месте.

0 голосов
/ 02 октября 2011
<?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>
0 голосов
/ 29 сентября 2011

Я попробовал ваш код .. Я изменил только первый шаблон, чтобы соответствовать:

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

, и он работал для меня, то есть получил имена заголовков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...