3

我正在尝试学习 xslt,并且我正在使用一个看起来像这样的 xml。

<Beats>
 <Beat>
   <Personal type="set">
      <Usages type="box">
       1233
      </Usages>
      <NonUsages type="box">
       4122
      </NonUsages>
   </Personal>

   <NonPersonal type="unset">
      <Damages type="box">
       6466
      </Damages>
      <NonDamages type="box">
       5544
      </NonUsages>
   </NonPersonal>

   <Confidential type="set">
      <Discounts type="box">
       1233
      </Discounts>
      <NonDiscounts type="box">
       4122
      </NonDiscounts>
   </Confidential>

 </Beat>
</Beats>

我目前的目标是打印出内部标签内的数字。但是我不能将标签的名称用作选择器,因为只有属性“类型”很重要。我尝试使用以下 xslt。但它似乎没有工作。

<xsl:output method="text"/>
<xsl:template match="*">
<html>
<body>
<h2> Test</h2>
<xsl:for-each select="//Beats/Beat/[@type='set']">
   <xsl:value-of select="[@type='box'] />
   <br/>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

我究竟做错了什么 ?

我想不通的另一件事是如何在使用属性作为选择器的同时获取标签的名称。代替

<xsl:value-of select="[@type='box'] />

它给出了标签内的内容;我可以使用什么来获取包含此“type=box”属性的标签的名称?(例如,Usages、NonUsages 等。)

4

1 回答 1

4

此转换旨在仅对您的原始转换提供必要的更正

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

    <xsl:template match="/">
        <html>
            <body>
                <h2> Test</h2>
                <xsl:for-each select="/*/*/*[@type='set']/*[@type='box']">
                    <xsl:value-of select="." />
                    <br/>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时(在更正它以使其成为格式良好的 XML 文档之后)

<Beats>
 <Beat>
   <Personal type="set">
      <Usages type="box">
       1233
      </Usages>
      <NonUsages type="box">
       4122
      </NonUsages>
   </Personal>

   <NonPersonal type="unset">
      <Damages type="box">
       6466
      </Damages>
      <NonDamages type="box">
       5544
      </NonDamages>
   </NonPersonal>

   <Confidential type="set">
      <Discounts type="box">
       1233
      </Discounts>
      <NonDiscounts type="box">
       4122
      </NonDiscounts>
   </Confidential>
 </Beat>
</Beats>

产生了(我猜是)想要的结果

<html>
   <body>
      <h2> Test</h2>
       1233
      <br/>
       4122
      <br/>
       1233
      <br/>
       4122
      <br/>
   </body>
</html>

它在浏览器中显示为

测试

1233
4122
1233
4122


关于你的第二个问题

我想不通的另一件事是如何在使用属性作为选择器的同时获取标签的名称。代替

<xsl:value-of select="[@type='box'] />

你想要的东西

<xsl:for-each select="/*/*/*[@type='set']/*[@type='box']">
  <xsl:value-of select="name()"/>
  <xsl:text> : </xsl:text>
  <xsl:value-of select="." />
  <br/>
</xsl:for-each>

现在完整的转换变成:

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

    <xsl:template match="/">
        <html>
            <body>
                <h2> Test</h2>
                <xsl:for-each select="/*/*/*[@type='set']/*[@type='box']">
                  <xsl:value-of select="name()"/>
                   <xsl:text> : </xsl:text>
                    <xsl:value-of select="." />
                    <br/>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

当它应用于同一个 XML 文档(上图)时,结果是

<html>
   <body>
      <h2> Test</h2>Usages : 
       1233
      <br/>NonUsages : 
       4122
      <br/>Discounts : 
       1233
      <br/>NonDiscounts : 
       4122
      <br/>
   </body>
</html>

这由浏览器显示为

测试

使用次数:1233 非使用
次数:4122
折扣:1233 非折扣
:4122

于 2012-10-19T22:56:17.293 回答