簡體   English   中英

泛化XSLT代碼

[英]Generalizing XSLT code

我正在嘗試學習對XSLT模板進行概括的各種可能性,以便在不同的地方重用它們。 到目前為止,我有兩種情況不知道如何進行。

情況1-源XML可能包含節點Foo1, Foo2, ..., Foo10 (但不必包含任何一個或全部)。 例如,

<Foo1>some value</Foo1>
<Foo3>some other value</Foo3>

我需要如下創建節點:

<Bar number="1">some value</Bar>
<Bar number="3">some other value</Bar>

我的XSLT當前非常簡單:

<xsl:if test="Foo1 != ''">
  <xsl:element name="Bar">
    <xsl:attribute name="number">1</xsl:attribute>
    <xsl:value-of select="Foo1"/>
  </xsl:element>
</xsl:if>

但是我顯然需要其中的10個代碼塊。 我該如何概括呢?

情況2-在源XML中,我有幾個結構基本相同的節點:

<Foo>
  <item>
    <Start>2015-06-01</Start>
    <End>9999-12-31</End>
    <Foo>00000008</Foo>
  </item> <!-- 0..n items -->
</Foo>

節點的名稱不同,為Foo ,其余的保持不變。 我需要構建的結構如下所示:

<Bars>
  <Bar From="2015-06-01" To="9999-12-31">
    <Value>00000008</Value>
  </Bar>
</Bars>

這是我的XSLT嘗試,但是再次,我需要許多彼此非常相似的模板:

<xsl:element name="Bars>
  <apply-templates select="Foo"/>
</xsl:element>

...

<xsl:template match="Foo/item">
  <xsl:element name="Bar">
    <xsl:attribute name="From">
      <xsl:call-template name="convertDate">
        <xsl:with-param name="theDate" select="Start"/>
      </xsl:call-template>
    </xsl:attribute>
    <xsl:attribute name="To">
      <xsl:call-template name="convertDate">
        <xsl:with-param name="theDate" select="End"/>
      </xsl:call-template>
    </xsl:attribute>
    <xsl:element name="Value">
      <xsl:value-of select="Foo"/>
    </xsl:element>
  </xsl:element>
</xsl:template>

再一次,我有幾個模板,它們看起來都非常相似(即,它們僅在FooBarValue元素的名稱上有所不同)。 有沒有機會對此進行概括,即提供一個可以處理所有這些情況的模板?

您可以使用

<xsl:template match="*[starts-with(local-name(), 'Foo')]">
  <Bar number="{translate(local-name(), translate(local-name(), '1234567890', ''), '')}">
    <xsl:apply-templates/>
  </Bar>
</xsl:template>

對於第一個樣本。

轉換

  <item>
    <Start>2015-06-01</Start>
    <End>9999-12-31</End>
    <Foo>00000008</Foo>
  </item>

  <Bar From="2015-06-01" To="9999-12-31">
    <Value>00000008</Value>
  </Bar>

您可以使用

<xsl:template match="item">
  <Bar From="{Start}" To="{End}">
    <xsl:value-of select="Foo"/>
  </Bar>
</xsl:template>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM