0

可以说我有如下输入。

<country>
    <name>countryname</name>
    <capital>captialname</capital>
    <population>19000</population>
</country>

我正在将元素名称转换为使用 xsl 说上层代码。有时可能不会出现国家的子元素。所以我可以如下写我的转换。

<xsl:template match="country">
    <xsl:element name="COUNTRY">
        <xsl:apply-templates select="name" />
        <xsl:apply-templates select="capital" />
        <xsl:apply-templates select="population" />
    </xsl:element>
</xsl:template>

<xsl:template match="name">
    <xsl:element name="NAME">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

<xsl:template match="capital">
    <xsl:element name="CAPITAL">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

<xsl:template match="population">
    <xsl:element name="POPULATION">
        <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

或者我可以这样做。

<xsl:template match="country">
<xsl:element name="COUNTRY">
    <xsl:if test="name">
        <xsl:element name="NAME">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:if>
    <xsl:if test="capital">
        <xsl:element name="CAPITAL">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:if>
    <xsl:if test="population">
        <xsl:element name="POPULATION">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:if>
</xsl:element>

我想知道哪种方式会使用更少的内存。我拥有的实际代码在模板内部大约有七个级别。所以我需要知道的是,如果我不使用简单元素的模板,是否会提高内存使用率。

4

2 回答 2

1

根据我的理解,第一个很好。只是改变:

<xsl:apply-templates select="name" />
        <xsl:apply-templates select="capital" />
        <xsl:apply-templates select="population" />

<xsl:apply-templates/>

仅当子元素不来时不必担心,有时 XSLT 会处理它。

于 2013-04-19T11:56:49.717 回答
0

我认为你是从错误的方式接近。您当前的 XSLT 模板不是很灵活。您将不断修改它以添加新元素。

相反,您应该使用身份转换,并包括一个模板来匹配任何通用元素,将名称输出为大写。

试试这个 XSLT

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

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

  <xsl:template match="*">
    <xsl:element name="{upper-case(local-name())}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

请注意以下模板匹配任何元素并将名称转换为大写

<xsl:template match="*">

而其他模板匹配将匹配属性或元素以外的任何其他节点,并按原样复制它们

<xsl:template match="@*|node()[not(self::*)]">

请注意,如果 XML 定义了名称空间,则此解决方案将不起作用,但无需进行太多调整即可使其应对。

于 2013-04-19T12:41:31.497 回答