的xslt动态值

  • 本文关键字:动态 xslt xslt-1.0
  • 更新时间 :
  • 英文 :


如何获得的动态值?

情况就是这样:

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

组合元素可以由客户定制。

所以,我现在拥有的是:
XSLT用于从系统A转换xml
一个简单的配置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的新手。

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

<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.

相关内容

  • 没有找到相关文章

最新更新