2012-04-21 166 views
2

做一些操作我一定要得到的屬性名稱,並以此爲基礎進行了其在XSLT名稱一些操作。獲取屬性名稱和XSLT

來源:

<group xlink:type="simple" xlink:href="XXX" xlink:title="sectionHeader_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
<group xlink:type="simple" xlink:href="YYY" xlink:title="BodyParagraph_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
<group xlink:type="simple" xlink:href="ZZZ" xlink:title="sectionHeader_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
<group xlink:type="simple" xlink:href="AAA" xlink:title="sectionHeader_3" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
<group xlink:type="simple" xlink:href="BBB" xlink:title="BodyParagraph_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
<group xlink:type="simple" xlink:href="BBB" xlink:title="ConditionalText_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 

我一定要得到的屬性xlink:title屬性,並檢查以下內容:

  • 當屬性的XLink:標題包含字符串sectionHeader,我需要做一些操作。
  • 當屬性的XLink:標題包含字符串BodyParagraph,我需要一些操作。
  • 當屬性的XLink:標題包含字符串ConditionalText,我需要一些操作。

任何一個可以解釋它是如何做呢?

回答

1

本着XSLT的精神使用模板和模式匹配,以便將顯式條件指令最小化或完全消除。

下面是如何可以做到這一點

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xlink="http://www.w3.org/1999/xlink"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="group"> 
    <xsl:apply-templates select="@xlink:title"/> 
</xsl:template> 

<xsl:template match="@xlink:title[contains(., 'sectionHeader')]"> 
    Found @xlink:title containing "sectionHeader" 
</xsl:template> 

<xsl:template match="@xlink:title[contains(., 'BodyParagraph')]"> 
    Found @xlink:title containing "BodyParagraph" 
</xsl:template> 

<xsl:template match="@xlink:title[contains(., 'ConditionalText')]"> 
    Found @xlink:title containing "ConditionalText" 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML片段(轉化爲良好的XML文檔)施加:

<t> 
    <group xlink:type="simple" xlink:href="XXX" xlink:title="sectionHeader_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group xlink:type="simple" xlink:href="YYY" xlink:title="BodyParagraph_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group xlink:type="simple" xlink:href="ZZZ" xlink:title="sectionHeader_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group xlink:type="simple" xlink:href="AAA" xlink:title="sectionHeader_3" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group xlink:type="simple" xlink:href="BBB" xlink:title="BodyParagraph_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group xlink:type="simple" xlink:href="BBB" xlink:title="ConditionalText_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
</t> 

想要的結果(東西在每種情況下進行)產生

Found @xlink:title containing "sectionHeader" 

    Found @xlink:title containing "BodyParagraph" 

    Found @xlink:title containing "sectionHeader" 

    Found @xlink:title containing "sectionHeader" 

    Found @xlink:title containing "BodyParagraph" 

    Found @xlink:title containing "ConditionalText" 

請注意:您可以考慮使用starts-with()函數,而不是。

+0

感謝你的信息 – Patan 2012-04-23 05:51:12

+0

@muzimil:不客氣。 – 2012-04-23 11:55:22

1

既然你不能修改與XSLT現有的XML文件的各個部分,你必須複製一切,改變應該是不同的部分。因此,我建議編寫一個默認複製每個節點的模板。然後,您可以爲符合您的條件的羣組元素添加專門的模板,例如是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xlink="http://www.w3.org/1999/xlink"> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="group[contains(@xlink:title,'sectionHeader')]"> 
    <group> 
     <xsl:copy-of select="@*"/>  
     <!-- modifications here --> 
    </group> 
    </xsl:template> 

    <xsl:template match="group[contains(@xlink:title,'BodyParagraph')]"> 
    <group> 
     <xsl:copy-of select="@*"/> 
     <!-- modifications here --> 
    </group> 
    </xsl:template> 

    <xsl:template match="group[contains(@xlink:title,'ConditionalText')]"> 
    <group> 
     <xsl:copy-of select="@*"/> 
     <!-- modifications here --> 
    </group> 
    </xsl:template> 
</xsl:stylesheet> 

如果你想改變的屬性值也只是更換了xsl:與所需的修改語句複製的。

1

你的源XML(做一些修改):

<?xml version="1.0"?> 
<root> 
    <group id="x1" xlink:type="simple" xlink:href="XXX" xlink:title="sectionHeader_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group id="x2" xlink:type="simple" xlink:href="YYY" xlink:title="BodyParagraph_1" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group id="x3" xlink:type="simple" xlink:href="ZZZ" xlink:title="sectionHeader_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group id="x4" xlink:type="simple" xlink:href="AAA" xlink:title="sectionHeader_3" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group id="x5" xlink:type="simple" xlink:href="BBB" xlink:title="BodyParagraph_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group id="x6" xlink:type="simple" xlink:href="BBB" xlink:title="ConditionalText_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
    <group id="x7" xlink:type="simple" xlink:href="BBB" xlink:title="some_other_2" xmlns:xlink="http://www.w3.org/1999/xlink"></group> 
</root> 

XSL文件:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink"> 

<xsl:template match="/"> 
    <elements> 
     <xsl:apply-templates/> 
    </elements> 
</xsl:template> 

<xsl:template match="//group[(contains(@xlink:title,'sectionHeader') or contains(@xlink:title,'BodyParagraph') or contains(@xlink:title,'ConditionalText'))]"> 
    <xsl:element name="element"> 
     <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute> 
     <xsl:attribute name="type"><xsl:value-of select="@xlink:type"/></xsl:attribute> 
     <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

而結果:

<?xml version='1.0' ?> 
<elements xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <element id="x1" type="simple" href="XXX"/> 
    <element id="x2" type="simple" href="YYY"/> 
    <element id="x3" type="simple" href="ZZZ"/> 
    <element id="x4" type="simple" href="AAA"/> 
    <element id="x5" type="simple" href="BBB"/> 
    <element id="x6" type="simple" href="BBB"/>  
</elements>