2017-01-18 90 views
1

我剛剛創建了一個XSL轉換,其中我將Xml轉換爲xHTML並返回。這是我第一次使用XSLT。現在我正在構建「後退部分」的逆向變革,並且我陷入困境。XSLT從參數中選擇節點併合併爲XML

簡介/概述

所以基本XML包含兩個節點(斷肢)我在哪裏尋找:

<frag id="10" name="Editable_Fragment" > 
<child id="11"></child> 
</frag> 
<frag id="20" name="Editable_Fragment2"> 
<child id="21"></child> 
</frag> 

順便說一下有這個XML裏面有很多碎片,但我只是希望爲「可編輯」的!所以我創建了這樣一個XSLT:

<?xml version="1.0"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 

    <xsl:apply-templates select="/review-case/review-document/review-channel/content/region/section/frag[@name='Editable_Fragment']/node()"/> 
    <xsl:apply-templates select="/review-case/review-document/review-channel/content/region/section/frag[@name='Editable_Fragment2']/node()"/> 

</xsl:template> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

兩個節點的內容在一個富文本編輯器中作爲一個字符串保持在一起!內容是這樣的:

<child id="11" name="Editable_Fragment">....data...</child> 
<child id="21" name="Editable_Fragment">....data...</child> 

在富文本編輯器,我改變這兩個節點的一些數據,後來我想更新與所謂的逆變換的數據。

反向轉換問題

與兩個「孩子」標籤的字符串參數mpTransformParameters內用於進一步處理。我必須使用這個參數。我知道下面的XSLT代碼,我只是用child id =「11」和child id =「21」更新frag id =「10」。

我的問題是,我怎麼能合併回更新子ID =「11」到「破片ID = 10」和 子ID =「21‘斷枝ID = 20’,如果兩者一起上線?

「反向」 XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output indent="yes"/> 
<xsl:param name="mpTransformParameters"/> 

<xsl:template match="review-case/review-document/review-channel/content/region/section/frag/child[@name='Editable_Fragment']"> 
<xsl:value-of select="$mpTransformParameters" disable-output-escaping="yes"/>   
</xsl:template> 

<xsl:template match="@* | node()"> 
<xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
</xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

非常感謝

回答

0

嘗試這樣的XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" omit-xml-declaration="yes"/> 
    <xsl:param name="mpTransformParameters"> 
    &lt;child id="11" name="Editable_Fragment"&gt;..data 11..&lt;/child&gt; 
    &lt;child id="21" name="Editable_Fragment"&gt;..data 22..&lt;/child&gt; 
    </xsl:param> 

    <xsl:template match="section"> 
    <xsl:variable name="tbl" 
     select="tokenize($mpTransformParameters, '&lt;/child&gt;')"/> 
    <xsl:copy> 
     <xsl:for-each select="$tbl"> 
     <xsl:analyze-string select="." 
      regex="id=&quot;(\d+)&quot;.*&gt;(.*)"> 
      <xsl:matching-substring> 
      <xsl:variable name="id" select="number(regex-group(1)) - 1"/> 
      <xsl:variable name="txt" select="regex-group(2)"/> 
      <xsl:variable name="nm"> 
       <xsl:if test="$id=10"><xsl:text>Editable_Fragment</xsl:text></xsl:if> 
       <xsl:if test="$id=20"><xsl:text>Editable_Fragment2</xsl:text></xsl:if> 
      </xsl:variable> 
      <xsl:element name="frag"> 
       <xsl:attribute name="id" select="$id"/> 
       <xsl:attribute name="name" select="$nm"/> 
       <xsl:value-of select="$txt"/> 
      </xsl:element> 
      </xsl:matching-substring> 
     </xsl:analyze-string> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@* | node()"> 
    <xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

我特意選擇XSLT 2.0,因爲它會在版本1.0 乏味的 寫它。

爲了試運行的目的,我給樣品值分配了mpTransformParameter

我準備稍微簡化XML輸入與部分元素的虛擬內容,你寫的,實際內容是mpTransformParameters

​​

使用它,我得到了以下結果:

<region> 
    <section> 
     <frag id="10" name="Editable_Fragment">..data 11..</frag> 
     <frag id="20" name="Editable_Fragment2">..data 22..</frag> 
    </section> 
</region>