2014-02-16 19 views
0

这里是我的代码一些简化的版本: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的数据填充。 我该怎么做?

+0

我不认为一个例子就足以建立一个规则。请详细解释如何从“1a”到达“A1a”。额外的“A”角色来自哪里? –

+0

我只会对这个问题的答案感到满意,因为我现在一直坚持这个问题(我会试着从中学习)。关于A,这是XML的外观(从DB生成),我无法改变它。 – Wolf

回答

0

当您想要从XML中的其他节点查找值时,通常可以使用“键”。

在这种情况下,您听起来好像要查找其名称以字母“A”开头的RAMPart1的子元素。所以,你可能会写这样的关键:

<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> 
+0

工作正常!谢谢!! – Wolf