我正在尝试计算如何向根节点添加属性。我有跟随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 version="1.0" encoding="utf-8" ?>
<Inspection lossFormsVersion="07-25-2013-1-52">
.
.
.
</Inspection>
<?xml version="1.0" encoding="utf-8" ?>
<Inspection lossFormsVersion="07-25-2013-1-54">
.
.
.
</Inspection>
<?xml version="1.0" encoding="utf-8" ?>
<Inspection>
.
.
.
</Inspection>
第二个XML文件转换后应该看起来与第一个转换的XML文件完全相同。提前致谢
答案 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提供的答案的逻辑应该是明确的。