gpt4 book ai didi

arrays - XSLT 将平面结构转换为数组

转载 作者:行者123 更新时间:2023-12-02 09:51:53 25 4
gpt4 key购买 nike

这是源 XML:

<customers>
<firstname1>Sean</firstname1>
<lastname1>Killer</lastname1>
<sex1>M</sex1>
<firstname2>Frank</firstname2>
<lastname2>Woods</lastname2>
<sex2>M</sex2>
<firstname3>Jennifer</firstname3>
<lastname3>Lee</lastname3>
<sex3>F</sex3>
</customers>

如何将其转换为这个?

<MyCustomers>
<Customer>
<Name> Sean Killer</Name>
<Sex>M</Sex>
</Customer>
<Customer>
<Name> Frank Woods</Name>
<Sex>M</Sex>
</Customer>
<Customer>
<Name>Jennifer Lee</Name>
<Sex>F</Sex>
</Customer>
</MyCustomers>

最佳答案

根据评论:

what if elements were not in consequent orders?

在这种情况下(假设 XSLT 1.0),您可以使用 translate() 获取元素的 id,然后通过使用 concat()< 构建的正确名称搜索相应的元素。我会将 following-sibling:: 轴更改为 ../ (parent:: 的缩写),以确保最终也捕获当前 firstname 之前的元素。

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

<xsl:template match="customers">
<MyCustomers>
<xsl:apply-templates select="*[starts-with(name(),'firstname')]"/>
</MyCustomers>
</xsl:template>

<xsl:template match="*[starts-with(name(),'firstname')]">
<xsl:variable name="id" select="translate(name(),'firstname','')"/>

<Customer>
<Name><xsl:value-of select="concat(.,' ',
../*[name()=concat('lastname',$id)])"/></Name>
<Sex><xsl:value-of select="../*[name()=concat('sex',$id)]"/></Sex>
</Customer>
</xsl:template>

</xsl:stylesheet>
<小时/>

答案已过时

假设问题中所示的固定输入文档结构,良好的 XSLT 1.0 转换是:

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

<xsl:template match="customers">
<MyCustomers>
<xsl:apply-templates select="*[starts-with(name(),'firstname')]"/>
</MyCustomers>
</xsl:template>

<xsl:template match="*[starts-with(name(),'firstname')]">
<Customer>
<Name><xsl:value-of select="concat(.,' ',
following-sibling::*[1]
[starts-with(name(),'lastname')])"/></Name>
<Sex><xsl:value-of select="following-sibling::*[2]
[starts-with(name(),'sex')]"/></Sex>
</Customer>
</xsl:template>

</xsl:stylesheet>
<小时/>

小解释

您需要 XPath 1.0 函数 starts-with(),因为您的 XML 输入中的标签名称令人悲伤。您可以使用 following-sibling:: 轴获取名称以 firstname 开头的任何元素所需的以下同级标签。

关于arrays - XSLT 将平面结构转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6655933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com