1

我对 XSLT 不是很熟悉。

基本上,我的原始 XML 中有一组项目,如下所示:

样本输入文件

<Items>
    <Items>Item1</Items>
    <Items>item2</Items>
    <Items>Item3</Items>
</Items>

来自样本输入的预期输出文档

<Items>
    <Items>
        <Item1>Y</Item1>Item1</Items>
    <Items>
        <Item1 />item2</Items>
    <Items>
        <Item1 />Item3</Items>
</Items>

如何使用 XSLT 检查每一个Items并在修改后的 XML 的字段中插入一个Y符号,或者如果找不到此类项目,则将该字段留空?

我现在有类似的东西,但我不确定这是否是正确的做法

      <xsl:if test="Items='Item1'">
        <Item1>Y</Item1>
      </xsl:if>
      <xsl:if test="Items!='Item1'">
        <Item1></Item1>
      </xsl:if>
4

1 回答 1

1

您不需要使用任何显式的条件 XSLT 指令——模板和模板模式是您的朋友

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="Items[not(*)]/text()[. = 'Item1']">Y</xsl:template>

 <xsl:template match="Items[not(*)]/text()" priority="0"/>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<Items>
    <Items>Item1</Items>
    <Items>item2</Items>
    <Items>Item3</Items>
</Items>

产生了想要的正确结果

<Items>
   <Items>Y</Items>
   <Items/>
   <Items/>
</Items>

说明

  1. 身份规则“按原样”复制选择执行的每个节点。

  2. 有两个覆盖模板——一个用于 的文本节点子节点Items,其值为“Item1”(“替换”),第二个——用于任何其他文本节点子节点Items——“删除”它,因为它的主体为空.

  3. “删除”模板将其priority属性设置为低(为零),以便明确解决与“替换”模板的任何优先级冲突。

于 2012-08-01T02:07:17.663 回答