如何在XSL XML文件中引用重复的文本块?

时间:2015-04-17 21:11:50

标签: xml xslt xml-rpc

在下面的示例XSL转换文件中,"记录"和"事件"模板几乎相同。它们在模板的顶部和底部有一些不同的文本,但中间有重复的文本,两者相同。

有没有办法可以将相同的文本放在另一个文件中,或者(理想情况下)放在同一个文件中的另一个块中,然后在"记录"中添加单行refence / include。和"事件"模板来引用该代码?

这样,我可以拥有一段只写一次的代码,但会被多次引用。以下是一个简化的例子。在我的实际工作中,重复的代码块要大得多,并且会重复多次。

谢谢。

<?xml version="1.0" encoding="UTF-8"?>
<!-- First define the style sheet format to be used -->
<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xi="http://www.w3.org/2001/XInclude"
  exclude-result-prefixes='xsl xi'
  type="text/xsl">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
      <xsl:apply-templates select="record"/>
      <xsl:apply-templates select="event"/>
</xsl:template>

<xsl:template match="event">
      [Event-specific XSL/XML...]<xsl:text>
      </xsl:text><Block name="{@name}" mutable="true"><xsl:text>
        </xsl:text><XmlElement elementName="action"><xsl:text>
          </xsl:text><XmlElement elementName="name"><xsl:text>
            </xsl:text><String value="Set"/><xsl:text>
          </xsl:text></XmlElement><xsl:comment>End of name</xsl:comment><xsl:text>
          </xsl:text><XmlElement elementName="params"><xsl:text>
              </xsl:text><Number value="{@id}" size="32" mutable="true"/><xsl:text>
            </xsl:text></XmlElement><xsl:comment>End of params</xsl:comment><xsl:text>
        </xsl:text></XmlElement><xsl:comment>action</xsl:comment><xsl:text>
      </xsl:text></Block><xsl:text>
      </xsl:text>[More Event-specific XSL/XML...]<xsl:text>
      </xsl:text>
</xsl:template>


<xsl:template match="record">
      [Record-specific XSL/XML...]<xsl:text>
      </xsl:text><Block name="{@name}" mutable="true"><xsl:text>
        </xsl:text><XmlElement elementName="action"><xsl:text>
          </xsl:text><XmlElement elementName="name"><xsl:text>
            </xsl:text><String value="Set"/><xsl:text>
          </xsl:text></XmlElement><xsl:comment>End of name</xsl:comment><xsl:text>
          </xsl:text><XmlElement elementName="params"><xsl:text>
              </xsl:text><Number value="{@id}" size="32" mutable="true"/><xsl:text>
            </xsl:text></XmlElement><xsl:comment>End of params</xsl:comment><xsl:text>
        </xsl:text></XmlElement><xsl:comment>action</xsl:comment><xsl:text>
      </xsl:text></Block><xsl:text>
     </xsl:text>[More Record-specific XSL/XML...]<xsl:text>
      </xsl:text>
</xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

您可以创建新模板

<xsl:template name="theCommonPart">
   <Block name="{@name}" mutable="true"><xsl:text>
    </xsl:text><XmlElement elementName="action"><xsl:text>
      </xsl:text><XmlElement elementName="name"><xsl:text>
        </xsl:text><String value="Set"/><xsl:text>
      </xsl:text></XmlElement><xsl:comment>End of name</xsl:comment><xsl:text>
      </xsl:text><XmlElement elementName="params"><xsl:text>
          </xsl:text><Number value="{@id}" size="32" mutable="true"/><xsl:text>
        </xsl:text></XmlElement><xsl:comment>End of params</xsl:comment><xsl:text>
    </xsl:text></XmlElement><xsl:comment>action</xsl:comment><xsl:text>
  </xsl:text></Block><xsl:text>
  </xsl:text>
</xsl:template>

并通过将此块替换为

从现有模板中调用它
<xsl:call-template name="theCommonPart"/>