在xslt中创建可重用模板以处理多次出现的元素

时间:2012-05-29 10:46:19

标签: xslt xslt-1.0

我想编写一个模板来处理某个部分并重复使用它。

在下面的XML中,我们看到每个中都重复了消息。我想编写一个模板来处理并在需要时调用它。

        <Data>

           <A>
              <text>this is text</text>
              <Message>
                <local>Local  link</local>
                <STD>External link</STD>
                </Message>
            </A>
            <B>
               <info>Information</info>
               <Message>
                <local>Local uri link</local>
                <STD>External link uri</STD>

                </Message>
            </B>
            <C>
               <longtext>Long Text</longtext>
               <Message>
                <local>Local uri link</local>
                <STD>External link uri</STD>

                </Message>
                </C>
        <Data>

需要输出:

    <Information>     
          <AA>
                this is text
                <MSG local value="Local uri link" STD value="External link"/>
            </AA>

            <BB>
                Information
                <MSG local value  ="Local uri link"  STD value="External link"/>

            </BB>
            <CC>
                Long Text
                <MSG local value="Local uri link" STD value="External link"/>
            </CC>

    <Information>

在处理每个节点中的标记时,我正在为A,B,C中的每个标记编写代码。

编写示例代码

    <Information>

        <xsl:template match="A">
        <AA>
            <xsl:value-of select="text"/>
            <xsl:element name="MSG">
                <xsl:attribute name="local value">
                    <xsl:value-of select="Message/local"/>
                </xsl:attribute>
                <xsl:attribute name="STD value">
                    <xsl:value-of select="Message/STD"/>
                </xsl:attribute>
        </AA>
    </Information>

类似地,对于每个模板,我明确地为块MSG编写代码。

现在我想写一个单独的模板来处理。我想从每个模板中调用此模板。

基本上我想重用写入进程的代码

任何人都可以帮我解决这个问题。

谢谢。

1 个答案:

答案 0 :(得分:3)

以下是一个示例:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Data">
  <Information>
    <xsl:apply-templates/>
  </Information>
</xsl:template>

<xsl:template match="Data/*">
  <xsl:element name="{local-name()}{local-name()}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

<xsl:template match="Data/A/text | Data/B/info | Data/C/longtext">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="Message">
  <MSG local-value="{local}" STD-value="{STD}"/>
</xsl:template>

</xsl:stylesheet>

应用于输入

<Data>

   <A>
      <text>this is text</text>
      <Message>
        <local>Local  link</local>
        <STD>External link</STD>
        </Message>
    </A>
    <B>
       <info>Information</info>
       <Message>
        <local>Local uri link</local>
        <STD>External link uri</STD>

        </Message>
    </B>
    <C>
       <longtext>Long Text</longtext>
       <Message>
        <local>Local uri link</local>
        <STD>External link uri</STD>

        </Message>
        </C>
</Data>

Saxon 6.5.5输出

<?xml version="1.0" encoding="utf-8"?><Information>

           <AA>
              this is text
              <MSG local-value="Local  link" STD-value="External link"/>
            </AA>
            <BB>
               Information
               <MSG local-value="Local uri link" STD-value="External link uri"/>
            </BB>
            <CC>
               Long Text
               <MSG local-value="Local uri link" STD-value="External link uri"/>
                </CC>
        </Information>

您发布的输入示例和所需的输出示例都不是格式良好的XML,因此我必须对要处理的元素或属性名称进行一些更改以及输出XML。