English 中文(简体)
在 XSLT 转换过程中在输出文档中特定点插入元素
原标题:Insert element at specific point in output document during XSLT transformation

我想知道您是否可以在处理过程中访问结果文件。

我之所以要求我改变输入文件, 是因为我想根据某些条件插入内容,

变换的 xml 看上去类似 :

<xform>
    <xforms>
        <model>
            <instance>
                <data />
                <data />
            </instance>
        </model>
        <bind />
        <bind />
        <bind />
    </xforms>
</xform>

在转换过程中(在上述xml序列化之前),我打算访问 标签,并插入额外的 元素。

Note The input document is different from the above xml - the above xml is what the transformation should produce.

同样,我想访问 元素,并插入额外的 节点。

因此,最后文件看起来是这样的(假设我增加了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>

感谢任何帮助。

最佳回答

否,您无法访问结果文档,但您可以在变量中创建临时树,然后再次处理这些树,如果需要使用不同模式的模板,则可以使用不同模式的模板。因此,不使用例如的模板。

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

该样本不使用模式,但我经常用变量和不同处理步骤来使用这些模式,将每个步骤的模板与其他步骤的模板进行清洁分离。

问题回答

<强>是,这样做的方式是处理 多通 处理 :

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

it 使用身份规则将它转换为自己,此第一个通过的结果在变量 $vPass1 中记录。然后第二个通过处理 $vPass1 中当前结果,并在 Instance 元素下增加两个新的 data 儿童,并在 模型 元素下增加三个 bind 儿童,最后结果为:

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




相关问题
When test hanging in an infinite loop

I m tokenising a string with XSLT 1.0 and trying to prevent empty strings from being recognised as tokens. Here s the entire function, based on XSLT Cookbook: <xsl:template name="tokenize"> ...

quick xslt for-each question

Let s say I have an XML document that has this: <keywords> <keyword>test</keyword> <keyword>test2</keyword> <keyword>test3</keyword> <keyword>test4</...

XSLT Transform XML with Namespaces

I m trying to transform some XML into HTML using XSLT. Problem: I can t get it to work. Can someone tell me what I m doing wrong? XML: <ArrayOfBrokerage xmlns:i="http://www.w3.org/2001/...

XSLT output to HTML

In my XSLT file, I have the following: <input type="button" value= <xsl:value-of select="name">> It s an error as it violates XML rule. What I actually want is having a value from an ...

Mangling IDs and References to IDs in XML

I m trying to compose xml elements into each other, and the problem I am having is when there s the same IDs. Basically what I need to do is mangle all the IDs in an xml file, as well as the ...

Sharepoint 2007 Data view Webpart custom parameters

I m sort of new to the custom parameters that can be setup on a DataView Webpart. There are 6 options: - None - Control - Cookie - Form - QueryString - Server Variable I think that None, Cookie and ...

热门标签