XSL - 如何检查当前节点是否没有文本,如果是,则添加文本

时间:2014-05-10 22:07:28

标签: xml xslt xslt-1.0

如果找到属性1234并且boolean1值,则代码将Y或N分配给元素ABC。 但有时属性ID 1234并不存在于/ Response / Specification / Section / item / Property中。 因此元素ABC在输出xml中保持为空。 当属性1234不存在时,我想将Element值设置为N. 我对XSL和XML都很陌生。

输入XML,其中每个规范标记包含多个部分和项目。每个部分和项目都有自己的ID。

<Response> <Specification> <Section> <sectionid>9999</sectionid> <item> <itemid>8888</itemid> <property> <id>1234</id> <property>ABC<property> <boolean1>1</boolean1> </property> <property> <id>5678</id> <property>XYZ<property> <boolean1>0</boolean1> </property> </property> <property> </property> </item> <item> </item> <item> </item> </Section> <Section> </Section> <Section>
</Section> </Specification> </Response>

良好形成的输入xml的小样本。

<Response>
<Specification>
    <Section>
        <Sectionid>9999</Sectionid>
            <Item>                
                <Itemid>8888</Itemid>
        <Property>
                        <id>1234</id>
                    <Property>ABC</Property>
                        <Boolean1>1</Boolean1>
                </Property>
                <Property>
                        <id>5678</id>
                        <Property>XYZ</Property>
                        <Boolean1>0</Boolean1>
                </Property>                
            </Item>
</Section>     
</Specification>
</Response>

在原帖中,我删除了一些元素。我虽然会简短而简单。以下是使用所有元素

更新的xsl
<ABC>
<xsl:for-each select="Response/Specification/Section/Item/Property[id=1234]">
    <xsl:choose>
        <xsl:when test="boolean1=1" >
            <xsl:text>Y</xsl:text>
        </xsl:when>                 
        <xsl:otherwise>
            <xsl:text>N</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</xsl:for-each>
</ABC> 
<XYZ>
<xsl:for-each select="Response/Specification/Section/Item/Property[id=5678]">
    <xsl:choose>
        <xsl:when test="boolean1=1" >
            <xsl:text>Y</xsl:text>
        </xsl:when>                 
        <xsl:otherwise>
            <xsl:text>N</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</xsl:for-each>
</XYZ> 

预期输出XML只有父标签,其中包含所有其他标签,如ABC,XYZ,PQR等。当属性ID 1234不存在时,输出为空ABC标签。这里我们要添加N而不是空标记。

<parenttag>
</ABC>
<XYZ>N</XYZ>
</parenttag>  

1 个答案:

答案 0 :(得分:2)

如果您有多个属性(或者属性?还记得XML,XSLT是区分大小写的),我会首先迭代 property 元素,但此时不检查任何值

<xsl:for-each select="Response/Specification/Section/item/property"> 

在此期间,如果您想要创建一个基于子属性元素的名称的元素,您可以将 xsl:element 与属性值模板一起使用动态指定元素名称。

<xsl:element name="{property}">   

然后,在此测试条件中,您可以拥有 xsl:choose ,包括检查&#34; 1234&#34;

<xsl:choose>
    <xsl:when test="ID=1234 and BOOLEAN1=1" >
        <xsl:text>Y</xsl:text>
    </xsl:when>         
    <xsl:otherwise>
        <xsl:text>N</xsl:text>
    </xsl:otherwise>
</xsl:choose>

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/">
      <parenttag>
         <xsl:for-each select="Response/Specification/Section/Item/Property">
            <xsl:element name="{Property}">
               <xsl:choose>
                  <xsl:when test="id=1234 and Boolean1=1">
                     <xsl:text>Y</xsl:text>
                  </xsl:when>
                  <xsl:otherwise>
                     <xsl:text>N</xsl:text>
                  </xsl:otherwise>
               </xsl:choose>
            </xsl:element>
         </xsl:for-each>
      </parenttag>
   </xsl:template>
</xsl:stylesheet>

编辑:如果元素名称取决于ID,并且您希望它们始终存在,您可以这样做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/">
      <parenttag>
         <ABC>
            <xsl:choose>
               <xsl:when test="Response/Specification/Section/Item/Property[id=1234]/Boolean1=1">
                  <xsl:text>Y</xsl:text>
               </xsl:when>
               <xsl:otherwise>
                  <xsl:text>N</xsl:text>
               </xsl:otherwise>
            </xsl:choose>
         </ABC>
         <XYZ>
            <xsl:choose>
               <xsl:when test="Response/Specification/Section/Item/Property[id=5678]/Boolean1=1">
                  <xsl:text>Y</xsl:text>
               </xsl:when>
               <xsl:otherwise>
                  <xsl:text>N</xsl:text>
               </xsl:otherwise>
            </xsl:choose>
         </XYZ>
      </parenttag>
   </xsl:template>
</xsl:stylesheet>

尽管为避免代码重复,您可以使用命名模板。试试这个

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/">
      <parenttag>
         <ABC>
            <xsl:call-template name="check">
               <xsl:with-param name="id" select="'1234'"/>
            </xsl:call-template>
         </ABC>
         <XYZ>
            <xsl:call-template name="check">
               <xsl:with-param name="id" select="'5678'"/>
            </xsl:call-template>
         </XYZ>
      </parenttag>
   </xsl:template>

   <xsl:template name="check">
      <xsl:param name="id"/>
      <xsl:choose>
         <xsl:when test="Response/Specification/Section/Item/Property[id=$id]/Boolean1=1">
            <xsl:text>Y</xsl:text>
         </xsl:when>
         <xsl:otherwise>
            <xsl:text>N</xsl:text>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>
</xsl:stylesheet>