2013-11-25 54 views
1

我使用升压序列化的持久性,并且由于库没有保存到旧版本的存档/数据结构的构想表示支持,不过,我觉得我给XSLT &根据需要,XPath将新版本转换为旧版本。 (这也是我第一次参与XSLT & XPath/XQuery,因此请原谅任何明显的错误)。但是,我已经完成了大约一半的工作,但似乎无法完成它(这也是我的第一次尝试进入XSLT & XPath/XQuery,请原谅任何明显的错误)。XSLT转换

这里是我的出发XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<!DOCTYPE boost_serialization> 
<boost_serialization signature="serialization::archive" version="7"> 
<tester class_id="0" tracking_level="0" version="0"> 
    <count>2</count> 
    <item_version>0</item_version> 
    <item class_id="2" class_name="CLASS_D" tracking_level="0" version="0"> 
     <A class_id="1" tracking_level="1" version="0" object_id="_0"> 
      <pimpl class_id="3" tracking_level="1" version="0" object_id="_1"> 
       <b>1</b> 
      </pimpl> 
     </A> 
     <pimpl class_id="4" tracking_level="1" version="0" object_id="_2"> 
      <c>2</c> 
     </pimpl> 
    </item> 
    <item class_id="5" class_name="CLASS_E" tracking_level="0" version="0"> 
     <A object_id="_3"> 
      <pimpl class_id_reference="3" object_id="_4"> 
       <b>1</b> 
      </pimpl> 
     </A> 
     <pimpl class_id="6" tracking_level="1" version="0" object_id="_5"> 
      <f>2</f> 
     </pimpl> 
    </item> 
</tester> 
</boost_serialization> 

我想要做的,是带有属性CLASS_NAME =“CLASS_E”要像CLASS_NAME =“CLASS_D”的项目改造项目,但我需要离开单独的object_id属性。

这就是我想要的:

<?xml version="1.0" encoding="utf-8"?> 
<boost_serialization signature="serialization::archive" version="7"> 
    <tester class_id="0" tracking_level="0" version="0"> 
    <count>2</count> 
    <item_version>0</item_version> 
    <item class_id="2" class_name="CLASS_D" tracking_level="0" version="0"> 
     <A class_id="1" tracking_level="1" version="0" object_id="_0"> 
     <pimpl class_id="3" tracking_level="1" version="0" object_id="_1"> 
      <b>1</b> 
     </pimpl> 
     </A> 
     <pimpl class_id="4" tracking_level="1" version="0" object_id="_2"> 
     <c>2</c> 
     </pimpl> 
    </item> 
    <item class_name="CLASS_D" class_id="2" tracking_level="0" version="0"> 
     <A object_id="_3"> 
     <pimpl class_id_reference="3" object_id="_4"> 
      <b>1</b> 
     </pimpl> 
     </A> 
     <pimpl class_id="4" tracking_level="1" version="0" object_id="_5"> 
     <c>2</c> 
     </pimpl> 
    </item> 
    </tester> 
</boost_serialization> 

这是模板我到目前为止:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" omit-xml-declaration="no" encoding="UTF-8" indent="yes"/> 

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

    <!-- replace attribute class_name value with another--> 
    <!-- replace attribute class_id value with another--> 
    <!-- only on this node!--> 
    <!-- could call another template to change more nested things--> 
    <xsl:template match="item/@class_name[. = 'CLASS_E']"> 
    <xsl:attribute name="class_name">CLASS_D</xsl:attribute> 
    <xsl:attribute name="class_id">2</xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

我不知道如何继续编辑项目的子节点我与此行匹配: 因为我需要将“f”节点更改为“c”并将pimpl“class_id”从6更改为4

在此先感谢

回答

1

你刚才匹配的产品属性,因此没有子节点!父节点将已通过身份模板,所以要“继续”编辑匹配的,只是有一个匹配的模板类标识码属性要匹配,但包括在XPath表达式相关项目匹配。

例如,改变平普尔元素的类标识码,添加这个模板

<xsl:template match="item[@class_name = 'CLASS_E']/pimpl/@class_id"> 
    <xsl:attribute name="class_id">4</xsl:attribute> 
</xsl:template> 

而改变˚F元素中,添加这个模板

<xsl:template match="item[@class_name = 'CLASS_E']/pimpl/f"> 
    <c> 
     <xsl:apply-templates select="@*|node()"/> 
    </c> 
</xsl:template> 

记住,该匹配适用于输入文档,因此在输出文档中将“CLASS_E”更改为“CLASS_D”并不重要。

请注意,您的当前模板可能与class_name属性相匹配。在此,您将用两个属性替换它,其中包括已存在的class_id属性。 XSLT将替换输出树中具有相同名称的属性已被输出。这意味着如果你的XML看起来像这样...

<item class_name="CLASS_E" class_id="5" tracking_level="0" version="0"> 

然后将输出实际上看这本

<item class_name="CLASS_D" class_id="5" tracking_level="0" version="0"> 

这是因为身份模板匹配模板后类标识码属性的CLASS_NAME匹配,因此将取代class_id属性,它是当前匹配的属性。

但削减长话短说,试试这个XSLT .....

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

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

    <xsl:template match="item/@class_name[. = 'CLASS_E']"> 
    <xsl:attribute name="class_name">CLASS_D</xsl:attribute> 
    </xsl:template> 

    <xsl:template match="item[@class_name = 'CLASS_E']/@class_id"> 
    <xsl:attribute name="class_id">2</xsl:attribute> 
    </xsl:template> 

    <xsl:template match="item[@class_name = 'CLASS_E']/pimpl/@class_id"> 
    <xsl:attribute name="class_id">4</xsl:attribute> 
    </xsl:template> 

    <xsl:template match="item[@class_name = 'CLASS_E']/pimpl/f"> 
    <c> 
     <xsl:apply-templates select="@*|node()"/> 
    </c> 
    </xsl:template> 
</xsl:stylesheet> 
+0

谢谢你这么多的详细答复。这有助于为我解决很多问题。 – Jeremy