如何用xslt中不同标签中的值替换大括号内的变量

时间:2019-07-16 13:43:18

标签: xslt xpath xslt-1.0

我正在使用xslt处理xml文件。

<ns1:declarationStatements>
    <ns1:parameterisedEntity>
        <ns2:code>NUTSUPSTATE20</ns2:code>
        <ns2:localeData>
            <ns1:description>
                <![CDATA[** When {s} according to instructions {m}g typically weighs {m}g.]]>
            </ns1:description>
            <ns1:id>20253</ns1:id>
        </ns2:localeData>
        <ns2:specType>FOOD</ns2:specType>
        <ns2:id>6653</ns2:id>
    </ns1:parameterisedEntity>
    <ns1:textParameters>
        <ns1:value>228</ns1:value>
        <ns1:id>68225</ns1:id>
        <ns1:sequence>2</ns1:sequence>
    </ns1:textParameters>
    <ns1:textParameters>
        <ns1:value>cooked</ns1:value>
        <ns1:id>68233</ns1:id>
        <ns1:sequence>0</ns1:sequence>
    </ns1:textParameters>
    <ns1:textParameters>
        <ns1:value>255</ns1:value>
        <ns1:id>68229</ns1:id>
        <ns1:sequence>1</ns1:sequence>
    </ns1:textParameters>
    <ns1:id>133421</ns1:id>
</ns1:declarationStatements>

我想在<ns1:description>中获取文字,即-

**When {s} according to instructions {m}g typically weighs {m}g

但是我希望{s},{m}和{m}被<ns1:textParameters>/<ns1:value>中的值替换。它看起来应该像-

**When cooked according to instructions 255g typically weighs 228g.

我尝试通过使用<xsl:value-of select="ns0:declarationStatements">和操纵字符串来做到这一点,但是它变得非常繁琐和复杂。

此类牙套的数量也可能有所不同。那么我们在XSLT中是否有类似List或Array的东西?

还有其他方法或技巧可以用来解决此问题吗?

谢谢

1 个答案:

答案 0 :(得分:1)

假设参数是按照其ns1:sequence值的顺序插入的,那么我首先将定义为:

<xsl:key name="text-param" match="ns1:textParameters" use="ns1:sequence" />

然后使用ns1:description作为string参数调用以下递归模板:

<xsl:template name="merge-params">
    <xsl:param name="string"/>
    <xsl:param name="i" select="0"/>
    <xsl:choose>
        <xsl:when test="contains($string, '{') and contains(substring-after($string, '{'), '}')">
            <xsl:value-of select="substring-before($string, '{')" />
            <xsl:value-of select="key('text-param', $i)/ns1:value" />
            <!-- recursive call -->
            <xsl:call-template name="merge-params">
                <xsl:with-param name="string" select="substring-after($string, '}')" />
                <xsl:with-param name="i" select="$i + 1" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$string" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>