无法在“Root”类型的节点中构造“Attribute”类型的项

时间:2013-09-03 18:11:43

标签: xml xslt xslt-1.0

我正在尝试计算如何向根节点添加属性。我有跟随xslt转换两种不同类型的xml文件。第一个xml文件转换正常我有问题当它的第二个xml文件我的xslt抛出错误“类型'属性'的项目不能在类型'根”的节点内构建“我如何在xslt中修复此问题

XSLT文件

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>

  <!--Check whether lossformsVersion exists If not write-->
  <xsl:template match="Inspection[not(@lossFormsVersion)]">
    <xsl:attribute name="lossFormsVersion">07-25-2013-1-54</xsl:attribute>
  </xsl:template>

  <!--Replace the lossformsVersion with this templates version-->
  <xsl:template match="Inspection/@lossFormsVersion">
    <xsl:attribute name="lossFormsVersion">07-25-2013-1-54</xsl:attribute>
  </xsl:template>

  <!--Copy the rest of the document as it is-->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

第一个XML文件(转换前)

<?xml version="1.0" encoding="utf-8" ?>
<Inspection lossFormsVersion="07-25-2013-1-52">
.
.
.
</Inspection>

第一个XML文件(转换后)

<?xml version="1.0" encoding="utf-8" ?>
<Inspection lossFormsVersion="07-25-2013-1-54">
.
.
.
</Inspection>

第二个XML文件(转换前)

<?xml version="1.0" encoding="utf-8" ?>
<Inspection>
.
.
.
</Inspection>

第二个XML文件转换后应该看起来与第一个转换的XML文件完全相同。提前致谢

2 个答案:

答案 0 :(得分:2)

<xsl:template match="Inspection[not(@lossFormsVersion)]">
    <xsl:copy>
        <xsl:attribute name="lossFormsVersion">07-25-2013-1-54</xsl:attribute>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

对于第二个xml,您的模板与您要输出的属性的元素匹配。 xsl:copy复制Ïnspection节点,属性写入。

答案 1 :(得分:0)

你可能会想到两种匹配模式

match = "Inspection [not(@lossFormsVersion)]"

match = "Inspection / @lossFormsVersion" 

是平行的;如果它们是平行的,那么你观察到的行为确实会令人惊讶。

但它们并不平行,越早掌握如何以及为什么,越早对基于XPath和XPath的语言感到满意。第一个模式匹配元素,其元素类型名称为Inspection,并且没有lossFormsVersion属性。第二个模式匹配位于lossFormsVersion属性上的名为Inspection属性

一旦你清楚了解,gp提供的答案的逻辑应该是明确的。