如何为每个字典元素调用模板?

时间:2017-07-12 10:28:20

标签: xslt

这是我的xml:

function minmax_vals = minmaxtest()
    buffSize = 1000000;
    A = rand(128,buffSize);
    windowSize = 100;
    minmax_vals = zeros(128,buffSize/windowSize*2);
    for i=1:(buffSize/windowSize)
        minmax_vals(:,(2*i-1)) = min(A(:,((i-1)*windowSize+1):(i*windowSize)),[],2);
        minmax_vals(:,(2*i)) = max(A(:,((i-1)*windowSize+1):(i*windowSize)),[],2);
    end
end

这是我的xsl。我不得不为同一个参数调用template1和template2几次:

<A>
  <D>dd</D>
  <E>ee</E>
  <B>
    <C>1</C>
    <C>2</C>
  </B>
</A>

现在,我必须为template1调用我的tamplates大约350次,为template2调用350次,我有很多键值对。 我想创建一个带有键值对的字典,并在tamplate1和template2

上进行处理
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0">

     <xsl:template match="/A">
        <xsl:call-template name="items1">
           <xsl:with-param name="key">aa</xsl:with-param>
           <xsl:with-param name="value">bb</xsl:with-param>
        </xsl:call-template>
         <xsl:call-template name="items2">
           <xsl:with-param name="key">aa</xsl:with-param>
           <xsl:with-param name="value">bb</xsl:with-param>
        </xsl:call-template>
         ...
     </xsl:template>

     <xsl:template name="template1 ">
       <xsl:param name="key"/>
       <xsl:param name="value"/>
       <xsl:value-of select="/D"/>
       <xsl:value-of select="$key"/>
       <xsl:value-of select="$value"/>
       ...
     </xsl:template>

    <xsl:template name="template2">
     <xsl:param name="key"/>
     <xsl:param name="value"/>
     <xsl:value-of select="/E"/>
     <xsl:value-of select="$key"/>
     <xsl:value-of select="$value"/>
     ...
    </xsl:template>

</xsl:stylesheet>

我的问题是解决我的问题是个好主意。如何在模板中获取根节点,现在当前节点是“item”。我想在我的模板中获得值od D节点。

1 个答案:

答案 0 :(得分:0)

如果没有看到完整的图片,很难回答你的问题。没有它我只能猜你想做:

<xsl:for-each select="$prodDict/item">
    <xsl:call-template name="Item">
        <xsl:with-param name="param1" select="@key"/>
        <xsl:with-param name="param" select="@value"/>
    </xsl:call-template>
</xsl:for-each>

请注意,这需要XSLT 2.0或更高版本。

加了:

  

如何在模板中获取根节点,现在当前节点是&#34; item&#34;。

一种方便的方法是将根节点放在全局变量中,以便可以从任何地方访问它。这是一个简单的例子:

<强> XML

<A>
  <D>dd</D>
  <E>ee</E>
  <B>
    <C>1</C>
    <C>2</C>
  </B>
</A>

XSLT 2.0

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

<xsl:variable name="values">
    <item key="A" value="aa"/>
    <item key="B" value="bb"/>
</xsl:variable>

<xsl:variable name="xml" select="/" />

<xsl:template match="/">
    <result>
        <xsl:for-each select="$values/item">
            <xsl:call-template name="template1">
                <xsl:with-param name="param1" select="@key"/>
                <xsl:with-param name="param2" select="@value"/>
            </xsl:call-template>
        </xsl:for-each>
    </result>
</xsl:template>

<xsl:template name="template1 ">
    <xsl:param name="param1"/>
    <xsl:param name="param2"/>
    <item>
        <d>
            <xsl:value-of select="$xml/A/D"/>
        </d>
        <key>
            <xsl:value-of select="$param1"/>
        </key>
        <value>
            <xsl:value-of select="$param2"/>
        </value>
    </item> 
</xsl:template>

</xsl:stylesheet>

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<result>
   <item>
      <d>dd</d>
      <key>A</key>
      <value>aa</value>
   </item>
   <item>
      <d>dd</d>
      <key>B</key>
      <value>bb</value>
   </item>
</result>