基于If语句将字符插入字段

时间:2012-07-31 20:43:48

标签: xml xslt

我对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>

1 个答案:

答案 0 :(得分: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. identity rule 复制每个节点,并按“原样”选择执行该节点。

  2. 有两个重写模板 - 一个用于Items的文本节点子节点,其值为“Item1”(“替换”),第二个 - 用于任何其他文本节点子节点Items - 由于其空身而“删除”它。

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