gpt4 book ai didi

xml - XSLT For-Each 循环从枚举标签中获取数据?

转载 作者:行者123 更新时间:2023-12-04 05:01:29 26 4
gpt4 key购买 nike

我得到了一个 SML 文件,其中设计者(不在我的公司,所以我无法控制它)创建了一些我需要使用的数据;但是他们设置了枚举标签,所以我很难创建一个循环来读取数据。

他们的代码看起来像

   <Root>
<Subjects>
<...more XML Data>
<Data>
<...other XML Data>
<Demographic_Information>
<Age1>33</Age1>
<Age2>66</Age2>
<Age3 />
<Age4 />
<Age5 />
<Age6 />
<Age7 />
<Age8 />
<Age9 />
<Age10 />
<Gender1>M</Gender1>
<Gender2>F</Gender2>
<Gender3 />
<Gender4 />
<Gender5 />
<Gender6 />
<Gender7 />
<Gender8 />
<Gender9 />
<Gender10 />
<Race1>W</Race1>
<Race2>H</Race2>
<Race3 />
<Race4 />
<Race5 />
<Race6 />
<Race7 />
<Race8 />
<Race9 />
<Race10 />
</Demographic_Information>
</...other XML Data>
</Data>
</...more XML Data>
</Subjects>
</Root>

我只需要遍历这个,并确保 Age1、Gender1 和 Race1 进入我的数据,如
<Person subject="1">
<Age>33</Age>
<Gender>M</Gender>
<Race>W</Race>
</Person>
<Person subject="2">
<Age>66</Age>
<Gender>F</Gender>
<Race>A</Race>
</Person>

这是更大集合中的数据子集,但如果可能,我需要将其转换为这种格式。我确定它可以做到,我只是不知道如何去做。

我的 XSLT 是 Microsoft Visual Studio 2008 中的 1.0 版。我从
<xsl:template match="/Root/Subjects">

***修改以提供我的问题的更好样本。

最佳答案

这是一个有效的快速尝试 - 我将继续研究这个以找到效率,但我想给你一个答案。

编辑:感谢@MartinHonnen 的简化。

当这个 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable
name="vNums"
select="'0123456789'"/>

<xsl:key
name="kElemByNumber"
match="Demographic_Information/*"
use="translate(name(), translate(name(), $vNums, ''), '')"/>

<xsl:template match="/*">
<Demographic_Information>
<xsl:apply-templates
select="*[generate-id() =
generate-id(key(
'kElemByNumber',
translate(name(), translate(name(), $vNums, ''),
''
))[1])][normalize-space()]">
<xsl:sort
select="translate(name(), translate(name(), $vNums, ''), '')"
data-type="number"/>
</xsl:apply-templates>
</Demographic_Information>
</xsl:template>

<xsl:template match="*">
<Person subject="{position()}">
<xsl:apply-templates
select="key('kElemByNumber', position())"
mode="children">
<xsl:sort select="name()"/>
</xsl:apply-templates>
</Person>
</xsl:template>

<xsl:template match="*" mode="children">
<xsl:element name="{translate(name(), $vNums, '')}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

...应用于提供的源 XML:
<Demographic_Information>
<Age1>33</Age1>
<Age2>66</Age2>
<Age3/>
<Age4/>
<Age5/>
<Age6/>
<Age7/>
<Age8/>
<Age9/>
<Age10/>
<Gender1>M</Gender1>
<Gender2>F</Gender2>
<Gender3/>
<Gender4/>
<Gender5/>
<Gender6/>
<Gender7/>
<Gender8/>
<Gender9/>
<Gender10/>
<Race1>W</Race1>
<Race2>H</Race2>
<Race3/>
<Race4/>
<Race5/>
<Race6/>
<Race7/>
<Race8/>
<Race9/>
<Race10/>
</Demographic_Information>

...产生了想要的结果:
<Demographic_Information>
<Person subject="1">
<Age>33</Age>
<Gender>M</Gender>
<Race>W</Race>
</Person>
<Person subject="2">
<Age>66</Age>
<Gender>F</Gender>
<Race>A</Race>
</Person>
</Demographic_Information>

关于xml - XSLT For-Each 循环从枚举标签中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16109282/

26 4 0