如何获得的动态值?
情况就是这样:
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.