Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 具有模式属性的XSLT 1.0模板_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

Xml 具有模式属性的XSLT 1.0模板

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?模板时犯了一些奇怪的明显错误,但到目前为止还没有发现。如有任何建议,将不胜感激。 谢谢大家。我不太清楚为什么首先要使用模式。下面的解决方案仅

输入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>