Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Xslt xsl按属性匹配模板(一个除外)_Xslt_Xpath - Fatal编程技术网

Xslt xsl按属性匹配模板(一个除外)

Xslt xsl按属性匹配模板(一个除外),xslt,xpath,Xslt,Xpath,我在样式表中的属性上有一个全局匹配,但我想排除f元素。我该怎么做 XML示例: <a> <b formatter="std">...</b> <c formatter="abc">...</c> <d formatter="xxx"> <e formatter="uuu">...</e> <f formatter="iii"> <g formatter

我在样式表中的属性上有一个全局匹配,但我想排除f元素。我该怎么做

XML示例:

<a>
<b formatter="std">...</b>
<c formatter="abc">...</c>
<d formatter="xxx">
    <e formatter="uuu">...</e>
    <f formatter="iii">
        <g formatter="ooo">...</g>
        <h formatter="uuu">...</h>
    </f>
</d>
</a>

...
...
...
...
...
当前解决方案:

<xsl:template match="//*[@formatter]">
   ...
</xsl:template>

...
我试过这样的方法,但没用

<xsl:template match="f//*[@formatter]">
...
</xsl:template>

<xsl:template match="//f*[@formatter]">
...
</xsl:template>

...
...

或者
//f[@formatter]
或者
f[@formatter]
都可以工作(不需要
//
)。在示例输入上运行此XSLT时:

<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="*[@formatter]">
    <xsl:element name="transformed-{local-name()}">
      <xsl:apply-templates select="@* | node()" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="f[@formatter]">
    <xsl:apply-templates select="node()" />
  </xsl:template>
</xsl:stylesheet>

结果是:

<a>
  <transformed-b formatter="std">...</transformed-b>
  <transformed-c formatter="abc">...</transformed-c>
  <transformed-d formatter="xxx">
    <transformed-e formatter="uuu">...</transformed-e>

      <transformed-g formatter="ooo">...</transformed-g>
      <transformed-h formatter="uuu">...</transformed-h>

  </transformed-d>
</a>

...
...
...
...
...

如您所见,
f
被排除在外。这是否回答了您的问题,或者我误解了您想要做什么?

或者
//f[@formatter]
或者
f[@formatter]
都可以工作(不需要
//
)。在示例输入上运行此XSLT时:

<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="*[@formatter]">
    <xsl:element name="transformed-{local-name()}">
      <xsl:apply-templates select="@* | node()" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="f[@formatter]">
    <xsl:apply-templates select="node()" />
  </xsl:template>
</xsl:stylesheet>

结果是:

<a>
  <transformed-b formatter="std">...</transformed-b>
  <transformed-c formatter="abc">...</transformed-c>
  <transformed-d formatter="xxx">
    <transformed-e formatter="uuu">...</transformed-e>

      <transformed-g formatter="ooo">...</transformed-g>
      <transformed-h formatter="uuu">...</transformed-h>

  </transformed-d>
</a>

...
...
...
...
...

如您所见,
f
被排除在外。这是否回答了您的问题,或者我误解了您想做什么?

您想排除f元素及其所有子元素,还是想保留子节点(将其上移一级)?我只想排除f元素。子节点应“正常”处理。元素
f
formatter
的属性是否总是
iii
?如果是,您可以将其作为标准。是否要排除f元素及其所有子元素,还是要保留子节点(将其上移一级)?我只想排除f元素。子节点应“正常”处理。元素
f
formatter
的属性是否总是
iii
?如果是的话,你可以以此为标准。很好的解决方案,我认为这就是sbo想要的+1很好的解决方案,我认为这是sbo想要的+1.