改变输出顺序 [英] change output order

查看:47
本文介绍了改变输出顺序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通常不会发布问题,但是2天的google和挫折感

打破了我的阻力。


我有一些可怕的xml看起来像这样:


<?xml version =" 1.0"?>

< foo xmlns =''urn:xxx :yyy''>

< stuff type =" why">

< morestuff type =" do">

< evenmore>

< stuff_overload type =" this">

< finally name =" {last}">

< value> Doe< / value>

< / finally>

< finally name =" {first}">

< value> John< / value>

< / finally>

< finally name =" {number}"> ;

< value> 14< / value>

< / finally>

< / stuff_overload>

< / evenmore>

< / morestuff>

< / stuff>

< stuff type =&q uot;为什么">

< morestuff type =" do">

< evenmore>

< stuff_overload type = this>

< finally name =" {last}">

< value> Smith< / value>

< / finally>

< finally name =" {first}">

< value> Jane< / value>

< / finally>

< finally name =" {number}">

< value> 15< / value>

< / finally>

< / stuff_overload>

< / evenmore>

< / morestuff> ;

< / stuff>

< / foo>

我想转换成这个:

John,Doe,14

Jane,Smith,15

所以我写了这个:

<?xml版本=" 1.0"?>

< xsl:stylesheet version =" 1.0"

xmlns:xsl =" http://www.w3 .org / 1999 / XSL / Transform"

xmlns:xdm =" urn:xxx:yyy">

< xsl:output method =" text" indent =" yes" />

< xsl:strip-space elements =" xdm:foo xdm:stuff xdm:morestuff xdm:evenmore

xdm: stuff_overload" />


< xsl:template match =" xdm:finally">

< xsl:apply-templates select =" ; xdm:finally [@name =''{first}'']" />

< xsl:apply-templates select =" xdm:finally [@name =''{ last}'']" />

< xsl:apply-templates select =" xdm:finally [@name =''{number}'']" />

< / xsl:template>


< xsl:template match =" xdm:finally [@name =''{first}''] ">< xsl:value-of

select =" xdm:value" />

< / xsl:template>


< xsl:template match =" xdm:finally [@name =''{last}'']">,< xsl:value-of

select =" xdm:value" />

< / xsl:template>


< xsl:template match =" xdm:最后,[@name =''{number}'']">,< xsl:value-of

select =" xdm:value" />< xsl:text>

< / xsl:text>

< / xsl:template>


< / xsl:stylesheet>


但我的输出看起来像:

,DoeJohn,14

,SmithJane,15

我''还尝试嵌套模板,以及大约100个其他东西。关于我做错的任何

想法都会有很大的帮助。


-tia

I don''t usually post questions, but 2 days of googleing and frustration
have broken my resistance.

I have some scary looking xml that looks something like this:

<?xml version="1.0"?>
<foo xmlns=''urn:xxx:yyy''>
<stuff type="why">
<morestuff type="do">
<evenmore>
<stuff_overload type="this">
<finally name="{last}">
<value>Doe</value>
</finally>
<finally name="{first}">
<value>John</value>
</finally>
<finally name="{number}">
<value>14</value>
</finally>
</stuff_overload>
</evenmore>
</morestuff>
</stuff>
<stuff type="why">
<morestuff type="do">
<evenmore>
<stuff_overload type="this">
<finally name="{last}">
<value>Smith</value>
</finally>
<finally name="{first}">
<value>Jane</value>
</finally>
<finally name="{number}">
<value>15</value>
</finally>
</stuff_overload>
</evenmore>
</morestuff>
</stuff>
</foo>
Which I would like to transform into this:
John,Doe,14
Jane,Smith,15

So I wrote this:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xdm="urn:xxx:yyy">
<xsl:output method="text" indent="yes"/>
<xsl:strip-space elements="xdm:foo xdm:stuff xdm:morestuff xdm:evenmore
xdm:stuff_overload"/>

<xsl:template match="xdm:finally">
<xsl:apply-templates select="xdm:finally[@name=''{first}'']"/>
<xsl:apply-templates select="xdm:finally[@name=''{last}'']"/>
<xsl:apply-templates select="xdm:finally[@name=''{number}'']"/>
</xsl:template>

<xsl:template match="xdm:finally[@name=''{first}'']"><xsl:value-of
select="xdm:value"/>
</xsl:template>

<xsl:template match="xdm:finally[@name=''{last}'']">,<xsl:value-of
select="xdm:value"/>
</xsl:template>

<xsl:template match="xdm:finally[@name=''{number}'']">,<xsl:value-of
select="xdm:value"/><xsl:text>
</xsl:text>
</xsl:template>

</xsl:stylesheet>

But my output looks like:
,DoeJohn,14
,SmithJane,15

I''ve also tried nesting the templates, and about 100 other things. Any
ideas on what I''m doing wrong would be a great help.

-tia

推荐答案

但我的输出如下:



你的模板

xsl :template match =" xdm:finally">


永远不会被调用,因为你的每个finally元素都有一个name属性和

匹配更高优先级由您的其他模板之一,所以

finally元素按照它们在源中出现的顺序进行处理。


如果它被调用它会生成没有结果因为它iis

< xsl:template match =" xdm:finally">

< xsl:apply-templates select =" xdm:finally [@name =''{first}'']" />

< xsl:apply-templates select =" xdm:finally [@name =''{last}'' ]" />

< xsl:apply-templates select =" xdm:finally [@name =''{number}'']" />

< / xsl:template>

所以它只是将模板应用到xdm:最后的孩子当前

xdm:finally元素但是没有这样的孩子。


你想匹配最终元素的父母,所以将上面的

更改为


< xsl:template match =" xdm:stuff_overload">

< xsl:apply-templates select =" xdm:finally [@name =''{first}''] " />

< xsl:apply-templates select =" xdm:finally [@name =''{last}'']" />

< xsl:apply-templates select =" xdm:finally [@name =''{number}'']" />

< / xsl:template>


David


Your template
xsl:template match="xdm:finally">

is never called as each of your finally element has a name attribute and
is matched with higher priority by one of your other templates, so the
finally elements are processed in the order they appear in the source.

If it was called it would produce no result as it iis
<xsl:template match="xdm:finally">
<xsl:apply-templates select="xdm:finally[@name=''{first}'']"/>
<xsl:apply-templates select="xdm:finally[@name=''{last}'']"/>
<xsl:apply-templates select="xdm:finally[@name=''{number}'']"/>
</xsl:template>
so it just applies templates to xdm:finally children of the current
xdm:finally element but there are no such children.

You want to match on teh parent of teh finally elements so change the
above to

<xsl:template match="xdm:stuff_overload">
<xsl:apply-templates select="xdm:finally[@name=''{first}'']"/>
<xsl:apply-templates select="xdm:finally[@name=''{last}'']"/>
<xsl:apply-templates select="xdm:finally[@name=''{number}'']"/>
</xsl:template>

David


哇。谢谢。这样做了!

Wow. Thank you. That did it!


FlickChick写道:
FlickChick wrote:
我通常不会发布问题,但是2天谷歌和挫折感已经打破了我的抵抗力。


谁告诉你使用XSLT执行这么简单的任务?

有些工具更容易处理。

在XMLgawk中使用以下脚本,我测试了它。


BEGIN {XMLMODE = 1; OFS = QUOT;," }

XMLCHARDATA {

data =
I don''t usually post questions, but 2 days of googleing and frustration
have broken my resistance.
Who told you to use XSLT for such a simple task ?
There are tools which are easier to handle.
The follwing script in XMLgawk works, I tested it.

BEGIN { XMLMODE=1; OFS="," }

XMLCHARDATA {
data =


这篇关于改变输出顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆