gpt4 book ai didi

xslt - 模块化 xslt?

转载 作者:行者123 更新时间:2023-12-04 06:03:16 29 4
gpt4 key购买 nike

如何在 xslt 转换中模块化一组重复的输出?例如,我有如下内容(伪代码)。

<foreach "path">
<if "count(/subPath) = 0">
<a><value-of "x"/></a>
<b><value-of "y"/></b>
<c></c>
</fi>
<else>
<foreach "subPath">
<a><value-of "../x"/></a>
<b><value-of "../y"/></b>
<c><value-of "z"/></c>
</foreach>
</else>
</foreach>

并想要以下内容
<foreach "path">
<if "count(/subPath) = 0">
<?/>
</fi>
<else>
<foreach "subPath">
<?/>
</foreach>
</else>
</foreach>
<?>
<a><value-of "../x"/></a>
<b><value-of "../y"/></b>
<c><value-of "z"/></c>
</?>

我在寻找什么构造?

最佳答案

一、伪代码翻译

您的伪代码将 1:1 转换为此 XSLT 转换 :

<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="/">
<xsl:for-each select="/t/m/n/p">
<xsl:choose>
<xsl:when test="not(subPath)">
<a><xsl:value-of select="x"/></a>
<b><xsl:value-of select="y"/></b>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="subPath">
<a><xsl:value-of select="../x"/></a>
<b><xsl:value-of select="../y"/></b>
<c><xsl:value-of select="z"/></c>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时 (问题中没有提供这样的文件!!!):
<t>
<m>
<n>
<p>
<x>1</x>
<y>2</y>
<subPath>
<z>3</z>
</subPath>
<subPath>
<z>4</z>
</subPath>
</p>
</n>
</m>
</t>

产生想要的正确结果 :
<a>1</a>
<b>2</b>
<c>3</c>
<a>1</a>
<b>2</b>
<c>4</c>

二、重构 :

这是一个重构的等效转换,不使用任何 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="p[not(subPath)]" name="processP">
<xsl:param name="pNode" select="."/>
<a><xsl:value-of select="$pNode/x"/></a>
<b><xsl:value-of select="$pNode/y"/></b>
</xsl:template>

<xsl:template match="p/subPath">
<xsl:call-template name="processP">
<xsl:with-param name="pNode" select=".."/>
</xsl:call-template>
<c><xsl:value-of select="z"/></c>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>

当应用于相同的 XML 文档(上图)时,同样会产生相同的正确结果 :
<a>1</a>
<b>2</b>
<c>3</c>
<a>1</a>
<b>2</b>
<c>4</c>

请注意 :
  • 模板/模式匹配以避免使用显式条件指令。这是最强大的、特定于 XSLT 的设计模式。
  • 没有重复的代码。
  • 在确切要求的条件下,每个模板都与它必须处理的节点完全匹配。
  • 第一个模板的代码通过给它一个名字来重用,这样它就可以被显式调用。这样就避免了代码重复。
  • 关于xslt - 模块化 xslt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8681250/

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