我正在使用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的东西?
还有其他方法或技巧可以用来解决此问题吗?
谢谢
答案 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>