gpt4 book ai didi

xslt - 如何在单个for-eachin XSLT中选择多个节点

转载 作者:行者123 更新时间:2023-12-04 11:45:09 25 4
gpt4 key购买 nike

我正在尝试学习XSLT,但以身作则,我工作得最好。我想执行一个琐碎的架构到架构的转换。我如何仅一次通过此转换(我当前的解决方案使用两次通过并失去了原始的客户订单)?

从:

<?xml version="1.0" encoding="UTF-8"?>
<sampleroot>

<badcustomer>
<name>Donald</name>
<address>Hong Kong</address>
<age>72</age>
</badcustomer>

<goodcustomer>
<name>Jim</name>
<address>Wales</address>
<age>22</age>
</goodcustomer>

<goodcustomer>
<name>Albert</name>
<address>France</address>
<age>51</age>
</goodcustomer>

</sampleroot>

至 :
<?xml version="1.0" encoding="UTF-8"?>
<records>

<record id="customer">
<name>Donald</name>
<address>Hong Kong</address>
<age>72</age>
<customertype>bad</customertype>
</record>

<record id="customer">
<name>Jim</name>
<address>Wales</address>
<age>22</age>
<customertype>good</customertype>
</record>

<record id="customer">
<name>Albert</name>
<address>France</address>
<age>51</age>
<customertype>good</customertype>
</record>

</records>

我已经解决了 不好的的问题(我失去了客户的订单,我认为我必须多次解析文件:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:template match="/sampleroot">

<records>

<xsl:for-each select="goodcustomer">
<record id="customer">
<name><xsl:value-of select="name" /></name>
<address><xsl:value-of select="address" /></address>
<age><xsl:value-of select="age" /></age>
<customertype>good</customertype>
</record>
</xsl:for-each>

<xsl:for-each select="badcustomer">
<record id="customer">
<name><xsl:value-of select="name" /></name>
<address><xsl:value-of select="address" /></address>
<age><xsl:value-of select="age" /></age>
<customertype>bad</customertype>
</record>
</xsl:for-each>

</records>
</xsl:template>
</xsl:stylesheet>

请有人可以帮助我提供正确的XSLT构造,其中我只需要使用一个解析(每个解析仅一个)?

谢谢,

克里斯

最佳答案

XSLT很好的做法是避免尽可能多地使用<xsl:for-each>

这是使用原理的简单解决方案:

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

<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="/*">
<records>
<xsl:apply-templates/>
</records>
</xsl:template>

<xsl:template match="badcustomer | goodcustomer">
<record>
<xsl:apply-templates/>
<customertype>
<xsl:value-of select="substring-before(name(), 'customer')"/>
</customertype>
</record>
</xsl:template>
</xsl:stylesheet>

请注意:
  • 仅使用模板和<xsl:apply-templates>
  • 身份规则的使用及其在必要时的覆盖。这是最基本的XSLT设计模式之一。
  • 关于xslt - 如何在单个for-eachin XSLT中选择多个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2775424/

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