我想知道您是否可以在处理期间访问结果文档。
我问的原因是我正在转换一个输入文档,并希望根据某些条件插入元素,但这必须在我遍历树时发生,而我几乎完成了创建它。
转换后的xml看起来与此类似:
<xform>
<xforms>
<model>
<instance>
<data />
<data />
</instance>
</model>
<bind />
<bind />
<bind />
</xforms>
</xform>
我打算在转换期间(在上面的xml序列化之前)访问<instance>
标记并插入其他<data>
元素。
注意 输入文档与上面的xml不同 - 上面的xml是转换应该生成的内容。
同样,我希望访问<xform>
元素并插入其他<bind>
个节点。
所以最终文档看起来像这样(假设我添加了2个数据节点和2个绑定节点):
<xform>
<xforms>
<model>
<instance>
<data />
<data />
<data>new data node</data>
<data>second new data node</data>
</instance>
</model>
<bind />
<bind />
<bind />
<bind>new bind node</bind>
<bind>second new bind node</bind>
</xforms>
</xform>
感谢任何帮助。
答案 0 :(得分:3)
不,您无法访问结果文档,但是您可以在变量中创建临时树,然后再次处理它们,如果需要,可以使用不同模式的模板。所以而不是像。
<xsl:template match="/">
<xsl:result-document href="example.xml">
<xform>
<xforms>
<model>
<instance>
<data>
</data>
</instance>
</model>
<bind />
<bind />
<bind />
</xforms>
</xform>
</xsl:result-document>
</xsl:template>
您将在变量中创建第一个结果,然后再进行处理,例如
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="temp1">
<xform>
<xforms>
<model>
<instance>
<data>
</data>
</instance>
</model>
<bind />
<bind />
<bind />
</xforms>
</xform>
</xsl:variable>
<xsl:result-document href="example.xml">
<xsl:apply-templates select="$temp1/*"/>
</xsl:result-document>
</xsl:template>
<xsl:template match="instance">
<xsl:copy>
<xsl:apply-templates/>
<data>...</data>
</xsl:copy>
</xsl:template>
该示例不使用模式,但我经常将它们与变量和不同的处理步骤一起使用,以便为其他步骤中的每个步骤清晰地分离模板。
答案 1 :(得分:1)
是的,执行此操作的方法是使用多次处理:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" mode="#default pass2">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="vPass1">
<xsl:apply-templates/>
</xsl:variable>
<xsl:apply-templates select="$vPass1/node()" mode="pass2"/>
</xsl:template>
<xsl:template match="instance" mode="pass2">
<instance>
<xsl:apply-templates mode="pass2"/>
<data>2</data>
<data>3</data>
</instance>
</xsl:template>
<xsl:template match="model" mode="pass2">
<model>
<xsl:apply-templates mode="pass2"/>
<bind>1</bind>
<bind>2</bind>
<bind>3</bind>
</model>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<xform>
<xforms>
<model>
<instance>
<data>
</data>
</instance>
</model>
<bind />
<bind />
<bind />
</xforms>
</xform>
使用标识规则将其转换为自身,并在变量$vPass1
中捕获第一遍的结果。然后第二遍处理$vPass1
中的当前结果,并在data
元素下添加两个新instance
子元素,在bind
元素下添加三个model
子元素 - 所以最终的结果是:
<xform>
<xforms>
<model>
<instance>
<data/>
<data>2</data>
<data>3</data>
</instance>
<bind>1</bind>
<bind>2</bind>
<bind>3</bind>
</model>
<bind/>
<bind/>
<bind/>
</xforms>
</xform>