Xml 具有模式属性的XSLT 1.0模板
输入XML: 我想为所有元素添加一个属性id=1,为没有子元素的元素添加一个属性级别=0 这是我实际的XSLT: mode=id的模板应与添加属性id的子元素匹配,mode=level的模板应与不同时添加属性id和级别的子元素匹配。但是由于某种原因,我得到了一些n=1和n=1.2.1的模板,它们没有被任何模板处理 实际输出XML: 我很确定我在使用mode?模板时犯了一些奇怪的明显错误,但到目前为止还没有发现。如有任何建议,将不胜感激。Xml 具有模式属性的XSLT 1.0模板,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,输入XML: 我想为所有元素添加一个属性id=1,为没有子元素的元素添加一个属性级别=0 这是我实际的XSLT: mode=id的模板应与添加属性id的子元素匹配,mode=level的模板应与不同时添加属性id和级别的子元素匹配。但是由于某种原因,我得到了一些n=1和n=1.2.1的模板,它们没有被任何模板处理 实际输出XML: 我很确定我在使用mode?模板时犯了一些奇怪的明显错误,但到目前为止还没有发现。如有任何建议,将不胜感激。 谢谢大家。我不太清楚为什么首先要使用模式。下面的解决方案仅
谢谢大家。我不太清楚为什么首先要使用模式。下面的解决方案仅使用通用模板即可实现所需的功能 带有模式的模板专门设计用于多次迭代树,从而两次或多次访问和处理节点 通常,尽可能少地中断身份转换。这就是为什么下面的样式表匹配 带div子元素的div元素div[div] 没有他们,div[notdiv], 应用最小的更改,然后使用应用模板将其余节点再次返回到标识转换 注意:这适合您显示的输入XML。然而,要使它与您的实际输入一起工作,您可能必须进行更改
<xsl:template match="div[div]">
到
取决于您的输入结构
样式表
输出
我不完全确定你为什么要首先使用模式。下面的解决方案仅使用通用模板即可实现所需的功能 带有模式的模板专门设计用于多次迭代树,从而两次或多次访问和处理节点 通常,尽可能少地中断身份转换。这就是为什么下面的样式表匹配 带div子元素的div元素div[div] 没有他们,div[notdiv], 应用最小的更改,然后使用应用模板将其余节点再次返回到标识转换 注意:这适合您显示的输入XML。然而,要使它与您的实际输入一起工作,您可能必须进行更改
<xsl:template match="div[div]">
到
取决于您的输入结构
样式表
输出
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<text>
<body>
<head>title1</head>
<div>
title2
<div id="1" level="0" n="1.1">
<head>title3</head>
<p>xyz</p>
<p>xyz</p>
</div>
<div id="1" n="1.2">
<head>title4</head>
<p>xyz</p>
<p>xyz</p>
<div>
xyz
xyz
</div>
</div>
</div>
</body>
</text>
</Root>
<xsl:template match="div[div]">
<xsl:template match="div[descendant::div]">
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="div[div]">
<xsl:copy>
<xsl:attribute name="id">1</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="div[not(div)]">
<xsl:copy>
<xsl:attribute name="id">1</xsl:attribute>
<xsl:attribute name="level">0</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<text>
<body>
<head>title1</head>
<div id="1">
<head>title2</head>
<div id="1" level="0">
<head>title3</head>
<p>xyz</p>
<p>xyz</p>
</div>
<div id="1">
<head>title4</head>
<p>xyz</p>
<p>xyz</p>
<div id="1" level="0">
<p>xyz</p>
<p>xyz</p>
</div>
</div>
</div>
</body>
</text>
</Root>