如何使用 XSL/XSLT 选择元素名称而不是值?

发布于 2024-12-07 05:38:11 字数 2852 浏览 1 评论 0原文

我们使用 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。

We are using XSL to convert a XML file into a pipe-delimited format.

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

We need the first line in the output to be the column headers, and everything else would be data, like this...

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

We've got the XSL working to get the data, but we can't get the header to output correctly. We just select the first tradedata_item element, then iterate the element name and separate them using | characters. Here is the full 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>
</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>
</xsl:text>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>

The output we're seeing is just data, no header...

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

Please disregard any namespace inconsistencies; I had to obfuscate the xml and xsl for legal reasons.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

勿挽旧人 2024-12-14 05:38:11

试试这个:

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

对我来说这似乎很简单。也许你的错误在其他地方。

Try this :

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

Output :

ORDER_ID|CUSIP|TICKER|SEC_NAME|ORDER_QTY|

It seems pretty simple to me. Maybe your error lies elsewhere.

弱骨蛰伏 2024-12-14 05:38:11

我尝试了你的代码..我只更改了第一个模板以匹配:

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

它对我有用,即获得了标题名称。

I tried your code.. I only changed the first template to match:

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

and it worked for me, i.e. got the header names.

初见 2024-12-14 05:38:11
<?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>
</xsl:text>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="tradedata_item[position()>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>
</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
<?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>
</xsl:text>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="tradedata_item[position()>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>
</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文