根据当前节点中特定atttribute的值,从XML文件中链接的文本中选择文本

时间:2017-04-10 09:04:59

标签: xml xslt-1.0

我有这个XML数据文件,其中包含以下描述( XML文件1 ):

<?xml version="1.0" encoding="UTF-8"?>
<Labels Version="170902">
    <AppointedAs>Appointed As</AppointedAs>
    <Elder>Elder</Elder>
    <MinisterialServant>Ministerial servant</MinisterialServant>
    <NotAppointed>Not appointed</NotAppointed>
</Labels>

我还有另一个XML数据库文件,其中包含有关发布者的详细信息。这是一个精简的示例,用于显示手头的问题( XML文件2 ):

<?xml version="1.0" encoding="utf-8"?>
<PublisherDatabase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.publictalksoftware.co.uk/msa">
  <Publishers>
    <Publisher Gender="Male" Appointed="MinisterialServant" Serving="Publisher">
      <Name>Brian Wood</Name>
    </Publisher>
  </Publishers>
</PublisherDatabase>

现在,您能在 XML文件2 中看到指定的属性吗?在 XML文件1 中重复,后者又包含正确的说明

为了做我需要的,我目前正在使用这个XSL脚本:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msa="http://www.publictalksoftware.co.uk/msa">
  <xsl:output method="html" indent="yes" version="4.01"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    doctype-public="//W3C//DTD XHTML 1.0 Transitional//EN"/>

  <xsl:variable name="PubDB" select="document('MSA_PublisherDatabase.XML')"/>
  <xsl:variable name="Labels" select="document('LabelsInfo.XML')"/>
  <xsl:template match="/">
    <html>
      <head>
        <title>Publishers Report</title>
        <link rel="stylesheet" type="text/css" href="Custom Publisher Report.css"/>
      </head>
      <body>
        <table>
          <thead>
            <th class="cellVerticalHeading">
              <xsl:value-of select="$Labels/Labels/AppointedAs"/>
            </th>
          </thead>
          <tbody>
            <xsl:apply-templates select="$PubDB/msa:PublisherDatabase/msa:Publishers/msa:Publisher[@Gender='Male']">
              <xsl:sort select="msa:Name" data-type="text" order="ascending"/>
            </xsl:apply-templates>
          </tbody>
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="msa:Publisher">
    <tr>
      <td>
        <xsl:choose>
          <xsl:when test="@Appointed='Elder'">
            <xsl:value-of select="$Labels/Labels/Elder"/>
          </xsl:when>
          <xsl:when test="@Appointed='MinisterialServant'">
            <xsl:value-of select="$Labels/Labels/MinisterialServant"/>
          </xsl:when>
          <xsl:when test="@Appointed='NotAppointed'">
            <xsl:value-of select="$Labels/Labels/NotAppointed"/>
          </xsl:when>
        </xsl:choose>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

以上 XSL 被删除。如您所见, @Appased 属性的值为 MinisterialServant 。然后,它使用此值在XML文件中的另一个链接中查找节点以获取要显示的文本(部长级服务员)。

这个XSL代码可以简化吗?我可以以某种方式直接使用XML文件中其他链接的查找中 @Appased 属性的值吗?

谢谢。

预期输出

   <html>
      <head>
        <title>Publishers Report</title>
        <link rel="stylesheet" type="text/css" href="Custom Publisher Report.css"/>
      </head>
      <body>
        <table>
          <thead>
            <th class="cellVerticalHeading">
              Appointed As
            </th>
          </thead>
          <tbody>
              <tr>
                  <td>
                       Ministerial servant
                  </td>
              </tr>
          </tbody>
        </table>
      </body>
    </html>

1 个答案:

答案 0 :(得分:1)

如果我理解您的请求,您可以将第二个模板替换为:

<xsl:template match="msa:Publisher">
    <tr>
        <td>
            <xsl:value-of select="$Labels/Labels/*[name()=current()/@Appointed]"/>
        </td>
    </tr>
</xsl:template>

此外,我相信您可以通过为转换创建MSA_PublisherDatabase.XML源XML来简化问题。然后你的样式表看起来像:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msa="http://www.publictalksoftware.co.uk/msa"
exclude-result-prefixes="msa">
<xsl:output method="html"/>

<xsl:variable name="labels" select="document('LabelsInfo.xml')"/>

<xsl:template match="/msa:PublisherDatabase">
    <html>
        <head>
            <!-- ... -->
        </head>
        <body>
            <table>
                <thead>
                    <!-- ??? -->
                </thead>
                <tbody>
                    <xsl:apply-templates select="msa:Publishers/msa:Publisher[@Gender='Male']">
                        <xsl:sort select="msa:Name" data-type="text" order="ascending"/>
                    </xsl:apply-templates>
                </tbody>
            </table>
        </body>
    </html>
</xsl:template>

<xsl:template match="msa:Publisher">
    <tr>
        <td>
            <xsl:value-of select="$labels/Labels/*[name()=current()/@Appointed]"/>
        </td>
    </tr>
</xsl:template>

</xsl:stylesheet>