2015-10-14 64 views
0

当我执行下面的xsl时,我得到一个截断的标签对而不是完整的标签(参见问题的最后)。用“xsl:value-of select”截断标签

原始代码:

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

<xsl:template match="CONFIG"> 
<xsl:choose> 
    <xsl:when test=" ../ID/.='2'"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:text>STANDARD</xsl:text> 
     </xsl:copy> 
    </xsl:when> 
</xsl:choose> 
</xsl:template> 
<xsl:template match="NAME"> 
<xsl:choose> 
    <xsl:when test=" ../ID/.='2'"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:text>DEVELOPMENT</xsl:text> 
     </xsl:copy> 
    </xsl:when> 
</xsl:choose> 
</xsl:template> 

修改后的代码:

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

<xsl:template match="CONFIG"> 
<xsl:choose> 
    <xsl:when test=" ../ID/.='2'"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:text>STD</xsl:text> 
     </xsl:copy> 
     <xsl:attribute name="KEY"> 
      <xsl:value-of select='0'/> 
     <xsl:attribute> 
     <xsl:attribute name="NAME"> 
      <xsl:value-of select="'DEVELOPMENT'"/> 
     <xsl:attribute> 
    </xsl:when> 
</xsl:choose> 
</xsl:template> 

这样的想法,而不是仅仅将CONFIG “标准”,我也想给SET键。 而不是处理相同的“查询”两次,我把名称的设置了。

KEY设置正确;但我得到的截断 <NAME> 代替
<NAME>DEVELOPMENT</NAME>

我显然不是一个XML的家伙,只是在做一些维护。任何线索或建议表示赞赏。

+0

什么是'node()\ @ *'? – Tomalak

+0

我怀疑反斜杠是'|' –

回答

0

在输出元素内容后,您无法创建属性。

移动<xsl:attribute>以上<xsl:text>

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

<xsl:template match="CONFIG[../ID = '2']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*" /> 
     <xsl:attribute name="KEY">0<xsl:attribute> 
     <xsl:attribute name="NAME">DEVELOPMENT<xsl:attribute> 
     <xsl:text>STD</xsl:text> 
    </xsl:copy> 
</xsl:template> 
+0

的拼写错误,似乎我知道的比我想象的还要小。 我拿起你的话说“不能创建属性”,这有助于,因为我没有试图创建,那是一个修改。 我真的想要做的是在ID上匹配,并更改ID,CONFIG和NAME。 由于这是维护,我打算踢,只是重复匹配/测试逻辑第三次,这似乎工作。它只是让我失望,因为它看起来应该只能匹配一次。 是的,\确实是| (我不能从这个系统剪切和粘贴,所以我必须抄录)。 感谢您的帮助。 – Cork333

+0

使用''创建属性会导致覆盖该名称的所有现有属性。实际上,这是一种修改,就像你似乎想要的一样。 (如果答案已经解决了您的问题,请不要忘记将答案标记为已接受。) – Tomalak

+0

事实证明它确实有效。问题是我使用的XML编辑器(XMLSpy)有一个内置的引擎并允许MS解析器。出于某种原因,内置解析器不显示正确的转换结果。所以它看起来像结束标签不在那里,但它是。 6小时地狱;以及一些我不会更新的kludgey代码。但是,这又是一个信息。 – Cork333