xslt动态值

时间:2011-06-17 14:21:02

标签: xslt-1.0

如何做动态值?

情况就是这样:

1)我们从系统A获得XML导出。
2)我们选择并格式化系统B所需的一些数据 3)其中一个传递的字段需要从源xml的多个元素组合。

组合元素可由客户自定义。

所以,我现在拥有的是这样的:
用于从系统A转换xml的XSLT 一个简单的配置xml,客户可以按顺序指定他想要组合的字段:

<items>
<field type="field">field1</field>
<field type="text">whatever the customer wants between the combined fields</field>
<field type="field">field2</field>
<field type="text">whatever the customer wants between/after the combined fields</field>
<field type="field">field3</field>
</items>

此xml的一个示例将转换为:

<field1>, <field2> and <field3> or <field1>+<field2>=<field3>

在我的xslt中我有这个:

<xsl:variable name="configfile" select="document(myconfigxml.xml)"/>

然后我使用xslt循环遍历字段类型和@type ='field'我希望使用字段的值来查看源xml的元素。

<xsl:template name="items">
    <xsl:param name="personElementFromSourceXml"/>
    <xsl:for-each select="$configfile/items/field">
        <xsl:choose>
            <xsl:when test="@type='field'">
                <xsl:value-of select="???"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>

我需要在???的地方键入什么? ?在伪xslt中它将是$personElementFromSourceXml/value-of-<field1-2-3> 我尝试了很多东西,比如concat($ personElementFromSourceXml,'/',current()),试过$ personElementFromSourceXml / current(),但它们不起作用。

此外,小理智检查:我的解决这个问题的想法是否正确,还是我违反了书中的每一条规则?请注意,我还是xslt的新手。

1 个答案:

答案 0 :(得分:0)

您有正确的想法,即通过名称的值选择其内容的元素。如果我误解了你的问题,请原谅我,但我将'items'文件解释为模板文件并假设一个单独的输入文件。例如。对于配置文件:

<items>
  <field type="text">Here are the contents of bark: </field>
  <field type="field">bark</field>
  <field type="text">Here are the contents of woof: </field>
  <field type="field">woof</field>
  <field type="text">The end of the line.
</field>
</items>

和源文件:

<file>
  <woof>Woof! Woof!</woof>
  <meow>Meow.</meow>
  <bark>Bark! Bark!</bark>
</file>

我改编了你的代码:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:variable name="configfile" select="document('config.xml')"/>
  <xsl:variable name="srcfile" select="/"/>

  <xsl:template match="/">
    <xsl:for-each select="$configfile/items/field">
      <xsl:choose>
        <xsl:when test="@type='field'">
          <xsl:variable name="tagname" select="."/>
          <xsl:value-of select="$srcfile/descendant::*[local-name()=$tagname]"/>
          <xsl:text>
</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="."/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

因为xsl:for-each正在迭代$configfile/items/field,所以每个field元素都成为上下文节点,因此您需要一种明确引用源文件的方法,这就是我分配它的原因到全局变量。我得到了这个输出:

Here are the contents of bark: Bark! Bark!
Here are the contents of woof: Woof! Woof!
The end of the line.