Разница между словами «где» и «если» в сценарии XSLT - PullRequest
0 голосов
/ 20 ноября 2018

Я новичок в XML / XSLT, и меня немного смущает разница между <xsl:if test="x"> и добавлением where="x" в конце оператора.

Ниже приведен пример данных и две версии кода XSLT. Я попытался запустить его обоими способами: https://www.w3schools.com/xml/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_ex1, но ничего не появляется, поэтому я могу что-то не так сделать. Кто-нибудь может уточнить это для меня?

 <?xml version="1.0"?>  
 <Tests xmlns="http://www.adatum.com">  
   <Test TestId="0001" TestType="CMD">  
     <Name>Convert number to string</Name>  
     <CommandLine>Examp1.EXE</CommandLine>  
     <Input>1</Input>  
     <Output>One</Output>  
   </Test>  
   <Test TestId="0002" TestType="CMD">  
     <Name>Find succeeding characters</Name>  
     <CommandLine>Examp2.EXE</CommandLine>  
     <Input>abc</Input>  
     <Output>def</Output>  
   </Test>  
   <Test TestId="0003" TestType="GUI">  
     <Name>Convert multiple numbers to strings</Name>  
     <CommandLine>Examp2.EXE /Verbose</CommandLine>  
     <Input>123</Input>  
     <Output>One Two Three</Output>  
   </Test>  
   <Test TestId="0004" TestType="GUI">  
     <Name>Find correlated key</Name>  
     <CommandLine>Examp3.EXE</CommandLine>  
     <Input>a1</Input>  
     <Output>b1</Output>  
   </Test>  
   <Test TestId="0005" TestType="GUI">  
     <Name>Count characters</Name>  
     <CommandLine>FinalExamp.EXE</CommandLine>  
     <Input>This is a test</Input>  
     <Output>14</Output>  
   </Test> 
 </Tests>

Использование where мой XSLT:

 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
   <xsl:for-each select="Tests/Test" where="@TestType='CMD'">
     <xsl:value-of select="current()">
   </xsl:for-each>
 </xsl:template>
 </xsl:stylesheet

Код с использованием if statemtent

 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
   <xsl:for-each select="Tests/Test">
     <xsl:if test="@TestType='CMD'">
       <xsl:value-of select="current()">
     </xsl:if>
   </xsl:for-each>
 </xsl:template>
 </xsl:stylesheet

1 Ответ

0 голосов
/ 20 ноября 2018

Атрибут no where для xsl:for-each.
То, что вы имеете в виду, называется предикатом , заключенным в Двойные скобки .

Так что поменяйте xsl:for-each с

<xsl:for-each select="Tests/Test" where="@TestType='CMD'">
  <xsl:value-of select="current()">
</xsl:for-each>

на

<xsl:for-each select="Tests/Test[@TestType='CMD']">
  <xsl:value-of select="current()">
</xsl:for-each>

Это должно сработать.

...