检查元素是否存在,如果不存在则添加特定元素

时间:2018-10-30 09:53:19

标签: xml xslt

已经有一段时间了,因为我需要XML,所以我在为正确的xslt进行以下转换而苦苦挣扎。

这是我的xml:

<?xml version="1.0" encoding="utf-8"?>
    <Dic Version="1">
       <Entry>
        <Text Lang="en">text1</Text>
        <Text Lang="de">text2</Text>
        <Text Lang="fr">text3</Text>
       </Entry>
        <Entry>
         <Text Lang="en">text1</Text>
         <Text Lang="de">text2</Text>
        </Entry>
    </Dic>

如果缺少<Text Lang="fr" />,则应添加它,以便输出如下所示:

<?xml version="1.0" encoding="utf-8"?>
    <Dic Version="1">
       <Entry>
        <Text Lang="en">text1</Text>
        <Text Lang="de">text2</Text>
        <Text Lang="fr">text3</Text>
       </Entry>
        <Entry>
         <Text Lang="en">text1</Text>
         <Text Lang="de">text2</Text>
         <Text Lang="fr"></Text>
        </Entry>
    </Dic>

我尴尬的无效样式表:

  <xsl:template match="Dic/Entry">
    <xsl:choose>
      <xsl:when test="@Lang=fr"></xsl:when>
      <xsl:otherwise><Text Lang="fr"></Text></xsl:otherwise>
    </xsl:choose>
  </xsl:template>

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果三种语言中的任何一种都可能丢失,那么我建议您这样做:

XSLT 1.0

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

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

<xsl:template match="Entry">
    <xsl:copy>
        <Text Lang="en"><xsl:value-of select="Text[@Lang='en']"/></Text>
        <Text Lang="de"><xsl:value-of select="Text[@Lang='de']"/></Text>
        <Text Lang="fr"><xsl:value-of select="Text[@Lang='fr']"/></Text>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>