读取XML模块名称/ XML节点参数

时间:2017-09-11 17:28:26

标签: xml xslt

鉴于那条XML:

<?xml version="1.0" encoding="UTF-8"?>
<History ModuleName="Table structure tree">
<Release Date="12122001" Version="3.1" Title="Carrier A" Author="">
    <Item Type="">Test A</Item>
</Release>
<Release Date="13122001" Version="3.2" Title="Carrier B" Author="">
    <Item Type="">Test B</Item>
</Release>
<Release Date="14122001" Version="3.3" Title="Carrier C" Author="">
    <Item Type="">Test C</Item>
</Release>
</History>

如何从节点&#34;历史&#34;中读取ModuleName? 我在这里有不同类型的值,我希望我的XSL显示一个标题或另一个标题,具体取决于模块名称的值。

e.g。如果ModuleName以&#34; Table structrue&#34;开头,则XSL中的标题应为&#34; Fields&#34;。如果ModuleName是其他内容,则标题应为&#34; Releases&#34;。

如何做到这一点?

我是XML / XSL的新手,所以我现在的代码(根本不起作用,我在这里问的原因)看起来像这样:

<xsl:variable name="historyvalue" select="History"/>
  <xsl:choose>
      <xsl:when test="not(starts-with($historyvalue, 'Table structure'))">
      <h3>Releases</h3>
    </xsl:when>
    <xsl:otherwise>
      <h3>Fields</h3>
    </xsl:otherwise>
  </xsl:choose>

1 个答案:

答案 0 :(得分:1)

您想要的值保存在ModuleName元素的History属性中,因此语法如下:

<xsl:variable name="historyvalue" select="History/@ModuleName"/>

请注意,这假设您位于匹配/的模板中(文档节点,它是History元素的父级)。

我还会考虑撤消xsl:choose中的逻辑以摆脱not

试试这个XSLT

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

  <xsl:template match="/">
    <xsl:variable name="historyvalue" select="History/@ModuleName"/>
    <xsl:choose>
      <xsl:when test="starts-with($historyvalue, 'Table structure')">
        <h3>Fields</h3>
      </xsl:when>
      <xsl:otherwise>
        <h3>Releases</h3>
      </xsl:otherwise>
    </xsl:choose>
   </xsl:template>
  <xsl:apply-templates />
</xsl:stylesheet>

在这种情况下你真的不需要变量,你就不用了,只需将xsl:when更改为......

<xsl:when test="starts-with(History/@ModuleName, 'Table structure')">

或者,考虑模板化方法,模板匹配中的逻辑,而不是xsl:choose

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

  <xsl:template match="History[starts-with(History/@ModuleName, 'Table structure')]">
    <h3>Fields</h3>
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="History">
    <h3>Releases</h3>
    <xsl:apply-templates />
  </xsl:template>
</xsl:stylesheet>

在此示例中,匹配历史记录和额外条件(History[starts-with(History/@ModuleName, 'Table structure')])的模板对匹配History的模板具有更高的优先级。