XSLT - 将数据动态填充到输入值中

时间:2014-02-16 09:08:09

标签: xml xslt

以下是我的代码的一些简化版本:

这是我的XML:

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="XSLTFile.xslt"?>
<ResultSet>
  <RAMTemplatePart>
    <Number>1</Number>
    <Title>STRUCTURAL DISCREPANCY IDENTIFICATION</Title>
    <RAMTemplateSection>
      <Number>1</Number>
      <RAMTemplatePartNumber>1</RAMTemplatePartNumber>
      <Title>PART 1 INFORMATION</Title>
      <RAMTemplateItem>
        <Letter>1a</Letter>
        <RamTemplateSectionNumber>1</RamTemplateSectionNumber>
        <Title>Non-routine or Log Page Number</Title>
      </RAMTemplateItem>
      <RAMTemplateItem>
        <Letter>1b</Letter>
        <RamTemplateSectionNumber>1</RamTemplateSectionNumber>
        <Title>PART 1 Revision Number</Title>
      </RAMTemplateItem>
    </RAMTemplateSection>
  </RAMTemplatePart>
  <RAM>
    <Id>26</Id>
    <CreatedBy>David</CreatedBy>
    <RAMPart1>
      <Id>21</Id>
      <RamId>26</RamId>
      <A1a>aaa</A1a>
      <A1b>bbb</A1b>
    </RAMPart1>
  </RAM>
</ResultSet>

这是我的XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <xsl:for-each select="ResultSet/RAMTemplatePart/RAMTemplateSection/RAMTemplateItem">
          <div>
            <xsl:value-of select="Letter"/>.
            <xsl:value-of select="Title"/>
            <input></input>
          </div>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

我想动态填充输入,例如,在RAMTemplateItem为1a的地方,它将填充来自RAMPart1 A1a的数据,以及来自A1b的1b等。 我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

如果要从XML中的其他节点查找值,通常可以使用“密钥”。

在这种情况下,听起来你想要查找 RAMPart1 的子元素,其名称以字母“A”开头。所以,你可以写下这样的密钥:

<xsl:key name="RAMPart1" 
         match="RAMPart1/*[starts-with(local-name(), 'A')]" 
         use="substring-after(local-name(), 'A')" />

这将允许您查找这些元素,但在“A”之后使用名称部分。例如,key('RAMPart1', '1a')将返回名称为“A1a”的元素。第二个参数不必是固定字符串,但可以是节点的值。例如,在您的情况下,您将执行此操作

<xsl:value-of select="key('RAMPart1', Letter)" />

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="RAMPart1" match="RAMPart1/*[starts-with(local-name(), 'A')]" use="substring-after(local-name(), 'A')" />
  <xsl:template match="/">
    <html>
      <body>
        <xsl:for-each select="ResultSet/RAMTemplatePart/RAMTemplateSection/RAMTemplateItem">
          <div>
            <xsl:value-of select="Letter"/>.
            <xsl:value-of select="Title"/>
            <input>
               <xsl:value-of select="key('RAMPart1', Letter)" />
            </input>
          </div>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>