2014-04-22 74 views
1

我有一个xml文档,需要用包含节点和处理指令的部分xml段替换特定节点。我想保留PI,但遇到更换问题。XSLT使用处理指令将部分XML段导入XML

段例如:general.xml

<root> 
    <!--General Settings --> 
    <?mapping EnvironmentSetting="envname"?> 
    <setting name="SubscriptionName" value="*" /> 
</root> 

源XML:

<environment> 
    <General /> 
</environment> 

变换 -

<xsl:template match="* | processing-instruction() | comment()"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*/General"> 
    <xsl:copy-of select="document('general.xml')/root"/> 
</xsl:template> 

的输出是:

<environment> 
    <root> 
    <!--General Settings --> 
    <?mapping EnvironmentSetting="envname"?> 
    <setting name="SubscriptionName" value="*" /> 
    </root> 
</environment> 

但我想:

<environment> 
    <!--General Settings --> 
    <?mapping EnvironmentSetting="envname"?> 
    <setting name="SubscriptionName" value="*" /> 
</environment> 

更改文档部分到根/ *下降处理的指令(和注释)

<xsl:copy-of select="document('general.xml')/root/*"/> 
... 
<environment> 
    <setting name="SubscriptionName" value="*" /> 
</environment> 

更改文档部分到根/过程的指令丢弃节点

<xsl:copy-of select="document('general.xml')/root/processing-instruction()"/> 
... 
<environment> 
    <?mapping EnvironmentSetting="envname"?> 
</environment> 

正在尝试做|只是比赛的第一个参数 -

<xsl:copy-of select="document('general.xml')/root/processing-instruction() | * | comment()"/> 
... 
<environment> 
    <?mapping EnvironmentSetting="envname"?> 
</environment> 

那么,如何让我的鱼与熊掌兼得呢?我看起来如此接近,但在找到我想做的事情的例子时遇到问题。

+0

修改后的身份模板是相当奇怪的。从实际的身份模板开始,为不希望复制的节点类型添加空模板会更有用。 '的 Tomalak

+0

不知道我理解你的意见,你的你指的身份模板,该模板部分我是相当新的XSLT? ,所以请原谅我的无知,如果这似乎是我问一个愚蠢的问题。 – James

+0

我指的是第一个''你的问题。恒等变换(又名身份模板)是XSLT真正的基本功能之一,你会仅靠这些关键字找到吨的阅读材料。 – Tomalak

回答

0

这应做到:

<xsl:template match="* | processing-instruction() | comment()"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*/General"> 
    <xsl:apply-templates select="document('general.xml')/root"/> 
</xsl:template> 

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

或者你可以把几种类型的使用union运算节点的副本:

<xsl:template match="*/General"> 
    <xsl:variable name="r" select="document('general.xml')/root" /> 
    <xsl:apply-templates select="$r/* | $r/processing-instruction() | $r/comment()" /> 
</xsl:template> 
+0

第一个例子是我需要什么。我其实有多个文档片段,并取决于我想作为输出XML,我需要抓住一个或多个这些片段。 我你会更多地关注你的第二个扩展我所做事情的例子,还没有使用变量 – James

+0

顺便说一句:定义你需要多次的变量是有意义的在顶层而不是在单独的模板中。 – Tomalak