Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSL if-else条件_Xml_Xslt_Xpath - Fatal编程技术网

Xml XSL if-else条件

Xml XSL if-else条件,xml,xslt,xpath,Xml,Xslt,Xpath,我有一个要求,我希望使用if-else语句来检查一个节点是否有属性或者它只有字符串 例如:一个节点找到了0个文件,另一个节点有属性,如 下面是两个节点的示例 <product> <autoIncludeUser>0 File(s) found</autoIncludeUser> <autoIncludeSystem> <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='

我有一个要求,我希望使用if-else语句来检查一个节点是否有属性或者它只有字符串

例如:一个节点找到了
0个文件
,另一个节点有属性,如

下面是两个节点的示例

<product>
<autoIncludeUser>0 File(s) found</autoIncludeUser>
<autoIncludeSystem>
<autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='64' filename='AFP_p.tgp' />
<autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='3,879' filename='AnalystsExpressionMacros.tgp' />
<autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='475' filename='base64Converter.tgp' />
<autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='&lt;DIR&gt;' filename='codePages' />
</autoIncludeSystem>
<autoIncludeStudio>0 File(s) found</autoIncludeStudio>
<externalLibrarySystem>
<externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='196,608' filename='AFPtoXML_DP.dll' />
<externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='13,259' filename='ASN1toXSDRunner.jar' />
<externalLibrarySystem>
</product>

找到0个文件
找到0个文件

我如何识别一个节点是否只有字符串或属性,并基于此,我可以分别获得
String
attrib值

我们可以使用下面的代码实现if-else

<xsl:choose>
    <xsl:when test="something to test">

    </xsl:when>
    <xsl:otherwise>

    </xsl:otherwise>
</xsl:choose>

这就是我所做的

<h3>System</h3>
    <xsl:choose>
        <xsl:when test="autoIncludeSystem/autoincludesystem_info/@mdate"> <!-- if attribute exists-->
            <p>
                <dd><table border="1">
                    <tbody>
                        <tr>
                            <th>File Name</th>
                            <th>File Size</th>
                            <th>Date</th>
                            <th>Time</th>
                            <th>AM/PM</th>
                        </tr>
                        <xsl:for-each select="autoIncludeSystem/autoincludesystem_info">
                            <tr>
                                <td valign="top" ><xsl:value-of select="@filename"/></td>
                                <td valign="top" ><xsl:value-of select="@filesize"/></td>
                                <td valign="top" ><xsl:value-of select="@mdate"/></td>
                                <td valign="top" ><xsl:value-of select="@mtime"/></td>
                                <td valign="top" ><xsl:value-of select="@ampm"/></td>
                            </tr>
                        </xsl:for-each>
                    </tbody>
                </table>
                </dd>
            </p>
        </xsl:when>
        <xsl:otherwise> <!-- if attribute does not exists -->
            <dd><pre>
                <xsl:value-of select="autoIncludeSystem"/><br/>
            </pre></dd> <br/>
        </xsl:otherwise>
    </xsl:choose>
系统

文件名
文件大小
日期
时间
上午/下午



我的输出


XPath
/*[非(@*)]
将选择所有没有属性的元素

使用
xsl:choose
可以很容易地做到这一点,但在XSLT中,更好的条件处理方法是编写不同的模板规则来处理不同的条件。因此,用
match=“*[@*]”
编写一个模板规则来匹配具有属性的元素,用
match=“*[text()]”
编写另一个模板规则来匹配具有文本内容的元素。

您可以将整个
xsl:choose
指令替换为:

<xsl:template match="autoIncludeSystem[autoincludesystem_info/@*]>
  <!-- code for elements with attributes (xsl:when) -->
</xsl:template>


<xsl:template match="autoIncludeSystem[not(autoincludesystem_info/@*)]>
  <!-- code for elements without attributes (xsl:otherwise) -->
</xsl:template>

然后添加两个模板:

concat(substring('String', 1 div boolean(text())),
                 ' ',
       substring('attrib values', 1 div boolean(@*))
       )

I.Xpath 1.0解决方案-使用此Xpath表达式

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="*[not(*)]">
     <xsl:value-of select="concat('&#10;', name(),': ')"/>

     <xsl:value-of select=
      "concat(substring('String', 1 div boolean(text())),
              ' ',
              substring('attrib values', 1 div boolean(@*))
             )
      "/>
 </xsl:template>
</xsl:stylesheet>
<product>
    <autoIncludeUser>0 File(s) found</autoIncludeUser>
    <autoIncludeSystem>
        <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='64' filename='AFP_p.tgp' />
        <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='3,879' filename='AnalystsExpressionMacros.tgp' />
        <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='475' filename='base64Converter.tgp' />
        <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='&lt;DIR&gt;' filename='codePages' />
    </autoIncludeSystem>
    <autoIncludeStudio>0 File(s) found</autoIncludeStudio>
    <externalLibrarySystem>
        <externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='196,608' filename='AFPtoXML_DP.dll' />
        <externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='13,259' filename='ASN1toXSDRunner.jar' />
    </externalLibrarySystem>
</product>
if(text())
  then 'String'
  else if(@*)
         then 'attrib values'
         else ()
<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="*[not(*)]">
     <xsl:value-of select="concat('&#10;', name(),': ')"/>

     <xsl:value-of select=
      "if(text())
         then 'String'
         else if(@*)
           then 'attrib values'
           else ()
      "/>
 </xsl:template>
</xsl:stylesheet>
这里是一个基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="*[not(*)]">
     <xsl:value-of select="concat('&#10;', name(),': ')"/>

     <xsl:value-of select=
      "concat(substring('String', 1 div boolean(text())),
              ' ',
              substring('attrib values', 1 div boolean(@*))
             )
      "/>
 </xsl:template>
</xsl:stylesheet>
<product>
    <autoIncludeUser>0 File(s) found</autoIncludeUser>
    <autoIncludeSystem>
        <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='64' filename='AFP_p.tgp' />
        <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='3,879' filename='AnalystsExpressionMacros.tgp' />
        <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='475' filename='base64Converter.tgp' />
        <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='&lt;DIR&gt;' filename='codePages' />
    </autoIncludeSystem>
    <autoIncludeStudio>0 File(s) found</autoIncludeStudio>
    <externalLibrarySystem>
        <externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='196,608' filename='AFPtoXML_DP.dll' />
        <externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='13,259' filename='ASN1toXSDRunner.jar' />
    </externalLibrarySystem>
</product>
if(text())
  then 'String'
  else if(@*)
         then 'attrib values'
         else ()
<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="*[not(*)]">
     <xsl:value-of select="concat('&#10;', name(),': ')"/>

     <xsl:value-of select=
      "if(text())
         then 'String'
         else if(@*)
           then 'attrib values'
           else ()
      "/>
 </xsl:template>
</xsl:stylesheet>
解释我们使用以下事实:

  • 对于任何字符串
    $s
    子字符串($s,无穷大)
    是空字符串

  • 1div0
    Infinity

  • 根据定义,
    number(true())
    1
    number(false())
    为0

    II。XPath 2.0解决方案

  • <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="*[not(*)]">
         <xsl:value-of select="concat('&#10;', name(),': ')"/>
    
         <xsl:value-of select=
          "concat(substring('String', 1 div boolean(text())),
                  ' ',
                  substring('attrib values', 1 div boolean(@*))
                 )
          "/>
     </xsl:template>
    </xsl:stylesheet>
    
    <product>
        <autoIncludeUser>0 File(s) found</autoIncludeUser>
        <autoIncludeSystem>
            <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='64' filename='AFP_p.tgp' />
            <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='3,879' filename='AnalystsExpressionMacros.tgp' />
            <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='475' filename='base64Converter.tgp' />
            <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='&lt;DIR&gt;' filename='codePages' />
        </autoIncludeSystem>
        <autoIncludeStudio>0 File(s) found</autoIncludeStudio>
        <externalLibrarySystem>
            <externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='196,608' filename='AFPtoXML_DP.dll' />
            <externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='13,259' filename='ASN1toXSDRunner.jar' />
        </externalLibrarySystem>
    </product>
    
    if(text())
      then 'String'
      else if(@*)
             then 'attrib values'
             else ()
    
    <xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="*[not(*)]">
         <xsl:value-of select="concat('&#10;', name(),': ')"/>
    
         <xsl:value-of select=
          "if(text())
             then 'String'
             else if(@*)
               then 'attrib values'
               else ()
          "/>
     </xsl:template>
    </xsl:stylesheet>
    
    这在XPath2.0中要容易得多,因为该语言有标准的
    if/then/else
    运算符

    使用

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="*[not(*)]">
         <xsl:value-of select="concat('&#10;', name(),': ')"/>
    
         <xsl:value-of select=
          "concat(substring('String', 1 div boolean(text())),
                  ' ',
                  substring('attrib values', 1 div boolean(@*))
                 )
          "/>
     </xsl:template>
    </xsl:stylesheet>
    
    <product>
        <autoIncludeUser>0 File(s) found</autoIncludeUser>
        <autoIncludeSystem>
            <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='64' filename='AFP_p.tgp' />
            <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='3,879' filename='AnalystsExpressionMacros.tgp' />
            <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='475' filename='base64Converter.tgp' />
            <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='&lt;DIR&gt;' filename='codePages' />
        </autoIncludeSystem>
        <autoIncludeStudio>0 File(s) found</autoIncludeStudio>
        <externalLibrarySystem>
            <externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='196,608' filename='AFPtoXML_DP.dll' />
            <externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='13,259' filename='ASN1toXSDRunner.jar' />
        </externalLibrarySystem>
    </product>
    
    if(text())
      then 'String'
      else if(@*)
             then 'attrib values'
             else ()
    
    <xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="*[not(*)]">
         <xsl:value-of select="concat('&#10;', name(),': ')"/>
    
         <xsl:value-of select=
          "if(text())
             then 'String'
             else if(@*)
               then 'attrib values'
               else ()
          "/>
     </xsl:template>
    </xsl:stylesheet>
    
    XSLT2.0验证:

    autoIncludeUser: String
    autoincludesystem_info: attrib values
    autoincludesystem_info: attrib values
    autoincludesystem_info: attrib values
    autoincludesystem_info: attrib values
    autoIncludeStudio: String
    externalLibrarySystem_info: attrib values
    externalLibrarySystem_info: attrib values
    

    任何例子都会有帮助,我也更新了我自己的答案,你能看看它会不会影响我的工作吗?@Abhishek,你能根据你的输入提供所需的输出吗?我在回答中提供了我的输出,所以我可以直接使用
    系统
    ?好问题,+1。请参阅我的答案,了解单个XPath 1.0表达式,该表达式实现了所需的
    if-then-else
    逻辑:我提供了一个基于XSLT的验证和详细解释。还添加了一个XPath 2.0解决方案。查看了XML后,应该使用
    xs:dateTime
    xs:long
    而不是蹩脚的美式类型。