Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 使用类似参数调用模板两次_Xslt_Parameter Passing_Xslt 2.0 - Fatal编程技术网

Xslt 使用类似参数调用模板两次

Xslt 使用类似参数调用模板两次,xslt,parameter-passing,xslt-2.0,Xslt,Parameter Passing,Xslt 2.0,现在我有一个如下的xml文件: 基本上所有标记都出现两次,但前缀为sideA或sideB <root> <sideA_foo>abc</sideA_foo> <sideA_bar>123</sideA_bar> <sideA_foobar>xyz</sideA_foobar> <!--many more sideA... tags --> <sideB_

现在我有一个如下的xml文件: 基本上所有标记都出现两次,但前缀为
sideA
sideB

<root>
    <sideA_foo>abc</sideA_foo>
    <sideA_bar>123</sideA_bar>
    <sideA_foobar>xyz</sideA_foobar>
    <!--many more sideA... tags -->

    <sideB_foo>def</sideB_foo>
    <sideB_bar>456</sideB_bar>
    <sideB_foobar>uvw</sideB_foobar>
    <!--many more sideB... tags -->
</root>

abc
123
xyz
def
456
紫外线
然后我有一个这样的模板

<xsl:template name="template1">
    <xsl:param name = "foo"/>
    <xsl:param name = "bar"/>
    <xsl:param name = "foobar"/>
    <!-- many more params -->

    <!-- do anything here -->
</xsl:template>

是否有一种优雅的方法可以使用所有参数调用此模板两次


我不喜欢把这一切都说得太详细了?

这里有一种方法你可以考虑:

给定一个输入示例:

<root>
    <sideA_width>5</sideA_width>
    <sideA_length>7</sideA_length>
    <sideB_width>6</sideB_width>
    <sideB_length>3</sideB_length>
</root>

5.
7.
6.
3.
以下样式表:

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

<xsl:template match="/root">
    <output>
        <xsl:call-template name="side-area">
            <xsl:with-param name="side" select="'sideA'"/>
        </xsl:call-template>
        <xsl:call-template name="side-area">
            <xsl:with-param name="side" select="'sideB'"/>
        </xsl:call-template>
    </output>
</xsl:template>

<xsl:template name="side-area">
    <xsl:param name="side"/>
    <xsl:param name="width" select="*[name()=concat($side, '_width')]"/>
    <xsl:param name="length" select="*[name()=concat($side, '_length')]"/>
    <xsl:element name="{$side}_area">
        <xsl:value-of select="$width * $length"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

将返回:

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <sideA_area>35</sideA_area>
   <sideB_area>18</sideB_area>
</output>

35
18
但是,请注意,元素的显式命名更有效——有时效率更高。真正优雅的解决方案是在输入之前对其进行规范化,使其看起来更像(例如):


5.
7.
6.
3.

你的意思是比。。。嗯,调用模板两次?知道这一点会很有见地。那么,也许我们可以建议最好的方法。我们需要一个格式良好的输入XML和完整的当前样式表。一般来说,使用并不是一种“优雅”的XSLT编写方式,所以这可能就是您陷入这种困境的原因。@Mathias Müller,您是对的,我可能需要在某个时候重新考虑我的整个结构,我会在有时间时这样做。michael.hor257k给出的答案在原则上接近我的实际问题。我不相信会有明显的(如果有的话)效率提高,元素的显式命名会降低可扩展性,因为每当元素名称更改时,您都必须更改样式表。不使用显式名称的最好例子是标识模板。@IheOnwuka可扩展性不是我的目标。没关系。此建议是为OP的利益而提供的。谢谢!我同意我的方法不是很优雅,我可能应该重新考虑一下。现在,这对我帮助很大。@WilliFischer如果你不想明确指定
X_length*X_width
(然后
Y_length*Y_width
,等等),那么最好的解决方案就是让提供输入的人更改格式。这就是我所说的“真正优雅的解决方案是在输入到达您面前对其进行规范化。”
<root>
    <rect id="X">
        <width>5</width>
        <length>7</length>
    </rect> 
    <rect id="Y">
        <width>6</width>
        <length>3</length>
    </rect> 
</root>