Xml XSL匹配一些但不是全部

Xml XSL匹配一些但不是全部,xml,xslt,Xml,Xslt,我从中得到了一个解决方案,该方案由 我现在需要在我的源XML中使用额外的字段,并且需要现有的标签完好无损,但是我在这方面遇到了问题 <instance> <NewTag>Hello</newTag1> <AnotherNewTag>Everyone</AnotherNewTag> <InfBy1>Dr Phibes</InfBy1> <InfBy2>Dr X</InfBy2&

我从中得到了一个解决方案,该方案由


我现在需要在我的源XML中使用额外的字段,并且需要现有的标签完好无损,但是我在这方面遇到了问题

<instance>
  <NewTag>Hello</newTag1>
  <AnotherNewTag>Everyone</AnotherNewTag>
  <InfBy1>Dr Phibes</InfBy1>
  <InfBy2>Dr X</InfBy2>
  <InfBy3>Dr Chivago</InfBy3>
</instance>

你好
每个人
菲布斯博士
X博士
奇瓦戈博士
它会删除附加标签和输出

<result xmlns:my="my:my">
  HelloEveryone 
  <items>
    <item>
      <label>Dr Phibes</label>
      <value>60</value>
    </item>
  </items>
  ...

大家好
菲布斯博士
60
...
我一直在用它做很多实验

<xsl:otherwise>
  <xsl:copy-of select=".">
  </xsl:copy-of>
</xsl:otherwise>

但是作为一个xsl新手,我似乎无法让它工作。我觉得我找错人了

有人有什么想法吗

谢谢


您的
NewTag
其他NewTag
元素与匹配。如果需要另一种转换,则需要声明此类规则

需要现有标签完好无损吗

那你是在找


这是
的一个副作用,它尝试为遇到的每个子节点找到匹配的模板,并结合隐含的XSLT“默认行为”

在您的情况下,它会遇到
,但这些节点没有模板

捕获这种情况的默认行为(隐藏的默认模板)将元素的文本值复制到输出流

的文本值是“Hello”,而
的文本值是“Everyone”,因此您可以看到“HelloEveryone”

如果不希望这样,请编写自己的模板来捕获这些节点:

<xsl:template match="NewTag|AnotherNewTag">
  <xsl:copy-of select="." />
</xsl:template>

或者,编写一个捕获任何未处理元素节点的节点:

<!-- empty templates do nothing (matched nodes do not appear in the output) -->
<xsl:template match="*" />


如果您希望复制未处理的节点,但仍希望在其中递归应用模板,则标识模板(@Alejandro的答案显示了这一点)是一个不错的选择。

XPath表达式匹配如何=“/*/*/*”?@Alejandro:谢谢Alejandro-非常有用!谢谢你的解释。我确实需要循环访问一些记录,因此使用了@Alejandro的解决方案。
<xsl:template match="NewTag|AnotherNewTag">
  <xsl:copy-of select="." />
</xsl:template>
<!-- empty templates do nothing (matched nodes do not appear in the output) -->
<xsl:template match="*" />