2013-03-13 82 views
0

我是XSLT新手,请原谅,如果这是一个noob问题。使用XSLT非规范化文档

比方说,我有这样的XML文档(2个private_rates一个酒店元素):

<hotel> 
    <private_rates> 
    <private_rate> 
     <id>1</id> 
    </private_rate> 
    <private_rate> 
     <id>2</id> 
    </private_rate> 
    </private_rates> 
</hotel> 

有没有办法使用XSLT把它改造成2个酒店元素,每一个私有率是多少?

<hotel> 
    <private_rates> 
    <private_rate> 
     <id>1</id> 
    </private_rate> 
    </private_rates> 
</hotel> 
<hotel> 
    <private_rates> 
    <private_rate> 
     <id>2</id> 
    </private_rate> 
    </private_rates> 
</hotel> 

那样的XSLT会是什么样子?任何帮助将不胜感激!谢谢。

+0

'我是新来的XSLT所以原谅我,如果这是一个小白question.'不要紧,只要您提供给我们什么你有没有尝试过你的结局。对或错,不要尝试不公平的要求别人去帮助。 Happy SO .. :) – 2013-03-13 08:31:01

回答

0

由于合法的XML文档必须包含一个包含文档元素的单个文档,因此我推测这一系列酒店正在进入某种程度。话虽这么说,这个怎么样:

<xsl:template match="hotel"> 
    <xsl:for-each select="private_rates/private_rate"> 
     <hotel> 
     <private_rates> 
      <xsl:copy> 
       <xsl:apply-templates /> 
      </xsl:copy> 
     </private_rates> 
     </hotel> 
    </xsl:for-each> 
</xsl:template> 

这里的apply-templates用法是假定你还必须在样式表的identity template将复制没有更具体的其他模板(如这一个)匹配的源内容。

顺便提一下,下划线在元素和属性名称中是不赞成的。

+1

我不知道谁对下划线皱眉。我不。 – 2013-03-13 08:15:40

+0

@jollymorphic,'顺便说一句,下划线在元素和属性名称中被压垮了。“我不认为这是一个有效的点,你能否解释? – 2013-03-13 08:27:42

+0

@其他:这只是一个旁观,纯粹是一种品味。我应该更多地沿着“有些人,包括我自己在内,对他们不满意,因为他们不必要地将编程语言中的标识符名称的限制转换为XML,这是一个不同的世界”。关于XML命名约定的主题还有另外一个StackOverflow问题值得浏览(并且没有人建议使用下划线):http://stackoverflow.com/questions/1074447/case-conventions-on-element-names – Jollymorphic 2013-03-13 13:53:32

2

作为替代Jollymorphic的解决方案,我更倾向于将

<xsl:template match="private_rates"> 
     <hotel> 
     <xsl:copy-of select="."/> 
     </hotel> 
</xsl:template> 
+0

+ 1,比起Jollymorphic的回答,我更喜欢这种不必要的“for-each” – 2013-03-13 08:31:47

+0

是的,这绝对会更好。 +1。 – Jollymorphic 2013-03-13 13:56:06