2017-03-07 23 views
0
I have a source document: 

<?xml version = "1.0" encoding = "UTF-8"?> 
<Circuit revision="B" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Block name="Design"> 
     <Data> 
      <Layer name="INDEX_4" Function="PLANE"></Layer> 
      <Layer name="INDEX_9" Function="CORE"></Layer> 
      <Group name="PRIMARY"> 
       <SubGroup name="GROUP_PRIMARY"> 
        <SubLayer Ref="INDEX_4" thickness="0.0350"></SubLayer> 
        <SubLayer Ref="INDEX_9" thickness="0.1000"></SubLayer> 
       </SubGroup> 
      </Group> 
     </Data> 
    </Block> 
</Circuit> 

該樣式表使用電流()提取對應的厚度:我有一個源文件:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 
<xsl:template match="/Circuit/Block/Data/Layer"> 
    <xsl:element name="{name()}"> 
     <xsl:attribute name="id"> 
      <xsl:value-of select="@name"/> 
     </xsl:attribute> 
     <xsl:attribute name="Function"> 
      <xsl:value-of select="@Function"/> 
     </xsl:attribute> 
     <xsl:value-of select="/Circuit/Block/Data/Group/SubGroup/SubLayer[@Ref=current()/@name]/@thickness"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

這裏的第二個樣式表,以提取PREVIOUS厚度值:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 
<xsl:template match="/Circuit/Block/Data/Layer"> 
    <xsl:element name="{name()}"> 
     <xsl:attribute name="id"> 
      <xsl:value-of select="@name"/> 
     </xsl:attribute> 
     <xsl:attribute name="Function"> 
      <xsl:value-of select="@Function"/> 
     </xsl:attribute> 
     <xsl:value-of select="/Circuit/Block/Data/Group/SubGroup/SubLayer[@Ref=preceding-sibling::*[1]/@name]/@thickness"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

在這兩種我得到這個案例:

<?xml version="1.0" encoding="UTF-8"?> 
    <Layer id="INDEX_4" Function="PLANE">0.0350</Layer> 
    <Layer id="INDEX_9" Function="CORE">0.1000</Layer> 

我試過前面的兄弟姐妹得到前面的值 - 我想問題是「前面的兄弟姐妹的上下文是什麼?」

它是具有Layer元素的組還是具有SubLayer元素的組?

由於

拉爾夫乙

回答

0

在任何謂詞上下文項是在謂詞之前的步驟所選擇的項目,以便與SubLayer[@Ref=preceding-sibling::*[1]/@name]兩個@Ref上下文以及preceding-sibling::*[1]/@nameSubLayer元件。如果要選擇相對於模板中當前匹配的Layer元素,則需要在謂詞內使用current()/preceding-sibling::*[1]/@name

+0

Martin, 這是一個救星!我永遠都不會這麼做 - 我已經瀏覽了很多書籍和網站。有什麼地方可以提供更多這樣的表達方式嗎? –

+0

XSLT和XPath 1.0已有15年曆史,XSLT和XPath 2.0現在已有近10年的歷史了,所以肯定有很多教程和書籍,例如https://www.pluralsight.com/courses/ xslt-foundations-part1或http://www.cranesoftwrights.com/training/index.htm#ptux –

+0

感謝您的鏈接 - 看起來不錯! Ralph B –

相關問題