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 文件完全相同。提前致谢

4

2 回答 2

3
<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 节点,属性写入该节点。

于 2013-09-03T18:26:47.453 回答
0

您可能会认为这两种匹配模式

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

match = "Inspection / @lossFormsVersion" 

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

但它们不是平行的,您越早掌握如何以及为什么,您就会越早熟悉 XPath 和基于 XPath 的语言。第一个模式匹配元素类型名称为Inspection且没有lossFormsVersion属性的元素。第二个模式匹配位于属性上的命名属性。lossFormsVersionInspection

一旦你清楚了这一点,gp 提供的答案的逻辑就应该很清楚了。

于 2013-09-04T00:08:10.830 回答