如何做动态值?
情况就是这样:
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的新手。
答案 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.