gpt4 book ai didi

xslt - 如何重构此 XSL 以利用应用模板?

转载 作者:行者123 更新时间:2023-12-01 08:56:11 26 4
gpt4 key购买 nike

拿这个question about beautiful XSL但更具体地说,我应该如何重构此 XSL 以利用应用模板和/或键。

我倾向于“过度使用”for-each 元素来控制源的上下文,我可以想象 apply-templates 可以提供帮助。尽管进行了很多 Google 搜索,但我仍然不明白如何在多个模板中控制上下文。

在下面的例子中,如何通过重构减少重复的 XPath 段?

    <xsl:template match="/">
<xsl:element name="Body">
<xsl:element name="Person">
<xsl:if test="/source/dbSrc/srv/v[@name='name']/text()='false'">
<xsl:element name="PhoneNumber" />
<xsl:element name="Zip">
<xsl:value-of
select="/source/req[1]/personal-info/address-info/zip-code" />

</xsl:element>
</xsl:if>
<xsl:if test="/source/dbSrc/srv/v[@name='name']/text()='true'">
<xsl:element name="PhoneNumber" />
<xsl:element name="Zip">
<xsl:value-of select="/source/req[3]/personal-info/address-info/zip-code" />
</xsl:element>
</xsl:if>
</xsl:element>

</xsl:template>

最佳答案

重构给定代码的一种初始方法如下:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<Body>
<Person>
<PhoneNumber/>
<Zip>
<xsl:apply-templates select=
"/*/dbSrc/srv/v[@name='name']"/>
</Zip>
</Person>
</Body>
</xsl:template>

<xsl:template match="v[@name='name' and .='true']">
<xsl:value-of select=
"/*/req[3]/personal-info/address-info/zip-code"/>
</xsl:template>

<xsl:template match="v[@name='name' and .='false']">
<xsl:value-of select=
"/*/req[1]/personal-info/address-info/zip-code"/>
</xsl:template>
</xsl:stylesheet>

请注意:重构代码不包含任何条件 xslt 指令。

进一步的重构可以让我们摆脱最后的模板,因为在这种情况下实际上不需要额外的模板——代码只创建一个元素并取决于一个条件:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="vCond" select=
"/*/dbSrc/srv/v[@name='name']/text()='true'"/>

<xsl:variable name="vInd" select=
"3*$vCond + 1*not($vCond)"/>

<xsl:template match="/">
<Body>
<Person>
<PhoneNumber/>
<Zip>
<xsl:value-of select=
"/*/req[position()=$vInd]
/personal-info/address-info/zip-code"/>
</Zip>
</Person>
</Body>
</xsl:template>
</xsl:stylesheet>

注意:这里我们假设 /*/dbSrc/srv/v[@name='name']/text() 只能有两个可能的值: 'true''false'

关于xslt - 如何重构此 XSL 以利用应用模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5173488/

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