2013-09-27 35 views
1

我正在處理一個文檔,我需要爲select元素生成xml:id屬性。我在縮小的示例文檔上運行了修改的標識轉換,並在輸出中獲得了一些額外的屬性。我認爲,這是一個命名空間的問題,但我不知道如何處理它。XSLT 2.0在選擇元素上生成xml:id

我知道我應該爲輸入文檔中的每個潛在元素編寫模板,但我不知道它們可能是什麼。有沒有辦法處理這個問題,而不訴諸寫一個詳盡的模板列表?

道歉,如果有太多的例子;下面輸出中的問題是出現在每個<p>。我使用的是XSLT 2.0和Saxon EE 9.5.0.2。感謝您的時間&麻煩。

輸入:

<?xml version="1.0" encoding="UTF-8"?> 
    <?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_lite.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?> 
    <?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_lite.rng" type="application/xml" 
    schematypens="http://purl.oclc.org/dsdl/schematron"?> 
    <TEI xmlns="http://www.tei-c.org/ns/1.0"> 
    <teiHeader> 
     <fileDesc> 
     <titleStmt> 
      <title>Title</title> 
     </titleStmt> 
     <publicationStmt> 
      <idno>1234</idno> 
     </publicationStmt> 
     <sourceDesc> 
      <p>Information about the source</p> 
     </sourceDesc> 
     </fileDesc> 
    </teiHeader> 
    <text> 
     <body> 
     <div type="book"> 
      <div type="chapter" n="1"> 
       <pb facs="003" n="1"/> 
       <head type="main">The Book's Title</head> 
       <head type="subhead">Chapter I.</head> 
       <p>Mauris suscipit ultricies odio, nec tincidunt justo laoreet et. Suspendisse nisi velit, dignissim et risus id, pulvinar rutrum tellus. Phasellus metus justo, lobortis eu lorem quis, tincidunt tempor ipsum. Proin suscipit suscipit massa. Sed nec bibendum sapien, id tempus metus. Nunc eu laoreet quam. Nam sagittis ac lorem sit amet venenatis.</p> 
      </div> 
      <div type="chapter" n="2"> 
       <head type="subhead">Chapter 2.</head> 
       <pb facs="005" n="3"/> 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis id ligula quis lacus sagittis luctus nec nec erat. Nunc in ultrices purus, a semper est. Fusce bibendum pharetra ornare. Donec tristique molestie eleifend. Mauris dignissim arcu sed urna auctor condimentum. Pellentesque rhoncus ante ut imperdiet consectetur. Duis blandit tortor dolor, ut mattis risus laoreet at. Donec eu dui ut enim pulvinar pharetra eu eget metus. In tortor ante, varius faucibus leo nec, malesuada aliquam neque. Quisque gravida, velit et iaculis tin/cidunt, quam augue condimentum purus, non elementum nisi magna vel odio.</p> 
      </div> 
      <div type="chapter" n="3"> 
       <head type="subhead">Chapter 3.</head> 
       <pb facs="007" n="5"/> 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis id ligula quis lacus sagittis luctus nec nec erat. Nunc in ultrices purus, a semper est. Fusce bibendum pharetra ornare. Donec tristique molestie eleifend. Mauris dignissim arcu sed urna auctor condimentum. Pellentesque rhoncus ante ut imperdiet consectetur. Duis blandit tortor dolor, ut mattis risus laoreet at. Donec eu dui ut enim pulvinar pharetra eu eget metus. In tortor ante, varius faucibus leo nec, malesuada aliquam neque. Quisque gravida, velit et iaculis tincidunt, quam augue condimentum purus, non elementum nisi magna vel odio.</p> 
      </div> 
     </div> 
     </body> 
    </text> 
</TEI> 

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://www.tei-c.org/ns/1.0" 
    xpath-default-namespace="http://www.tei-c.org/ns/1.0" 
    exclude-result-prefixes="#all" 
    version="2.0"> 
    <!-- adding xml:id values to P5 TEI --> 

    <!-- variables --> 
    <xsl:variable name="vID" select="/TEI/*/*/publicationStmt/idno[1]"/> 
    <xsl:variable name="vID-fileName" select="concat($vID, '_new.xml')"/> 
    <xsl:variable name="vID-primary" select="concat('ms', $vID)"/> 

    <!-- processing begins --> 
    <!-- identity transform --> 
    <!-- deep copy --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- add xml:id to document node --> 
    <xsl:template match="TEI"> 
     <TEI xmlns="http://www.tei-c.org/ns/1.0" xml:id="{$vID-primary}"> 
      <xsl:apply-templates/> 
     </TEI> 
    </xsl:template> 

    <!-- add xml:id to divs --> 
    <xsl:template match="div"> 
     <div> 
      <xsl:if test="@type"> 
       <xsl:attribute name="type"> 
        <xsl:value-of select="@type"/> 
       </xsl:attribute> 
      </xsl:if> 
      <xsl:if test="@n"> 
       <xsl:attribute name="n"> 
        <xsl:value-of select="@n"/> 
       </xsl:attribute> 
      </xsl:if> 
      <xsl:attribute name="xml:id"> 
       <xsl:value-of select="generate-id(.)"/> 
      </xsl:attribute> 
      <xsl:apply-templates/> 
     </div> 
    </xsl:template> 

    <xsl:template match="pb"> 
     <xsl:variable name="vN" select="@n"/> 
     <xsl:variable name="vFacs" select="@facs"/> 
     <pb facs="{$vFacs}" n="{$vN}" xml:id="{generate-id(.)}"/> 
    </xsl:template> 
</xsl:stylesheet> 

電流輸出:

<?xml version="1.0" encoding="UTF-8"?><?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_lite.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?><?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_lite.rng" type="application/xml" 
    schematypens="http://purl.oclc.org/dsdl/schematron"?><TEI xmlns="http://www.tei-c.org/ns/1.0" xml:id="ms1234"> 
    <teiHeader type="text"> 
     <fileDesc> 
     <titleStmt> 
      <title>Title</title> 
     </titleStmt> 
     <publicationStmt> 
      <idno>1234</idno> 
     </publicationStmt> 
     <sourceDesc default="false"> 
      <p part="N">Information about the source</p> 
     </sourceDesc> 
     </fileDesc> 
    </teiHeader> 
    <text> 
     <body> 
     <div type="book" xml:id="d2e33"> 
      <div type="chapter" n="1" xml:id="d2e35"> 
       <pb facs="003" n="1" xml:id="d2e37"/> 
       <head type="main">The Book's Title</head> 
       <head type="subhead">Chapter I.</head> 
       <p part="N">Mauris suscipit ultricies odio, nec tincidunt justo laoreet et. Suspendisse nisi velit, dignissim et risus id, pulvinar rutrum tellus. Phasellus metus justo, lobortis eu lorem quis, tincidunt tempor ipsum. Proin suscipit suscipit massa. Sed nec bibendum sapien, id tempus metus. Nunc eu laoreet quam. Nam sagittis ac lorem sit amet venenatis.</p> 
      </div> 
      <div type="chapter" n="2" xml:id="d2e49"> 
       <head type="subhead">Chapter 2.</head> 
       <pb facs="005" n="3" xml:id="d2e54"/> 
       <p part="N">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis id ligula quis lacus sagittis luctus nec nec erat. Nunc in ultrices purus, a semper est. Fusce bibendum pharetra ornare. Donec tristique molestie eleifend. Mauris dignissim arcu sed urna auctor condimentum. Pellentesque rhoncus ante ut imperdiet consectetur. Duis blandit tortor dolor, ut mattis risus laoreet at. Donec eu dui ut enim pulvinar pharetra eu eget metus. In tortor ante, varius faucibus leo nec, malesuada aliquam neque. Quisque gravida, velit et iaculis tin/cidunt, quam augue condimentum purus, non elementum nisi magna vel odio.</p> 
      </div> 
      <div type="chapter" n="3" xml:id="d2e60"> 
       <head type="subhead">Chapter 3.</head> 
       <pb facs="007" n="5" xml:id="d2e65"/> 
       <p part="N">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis id ligula quis lacus sagittis luctus nec nec erat. Nunc in ultrices purus, a semper est. Fusce bibendum pharetra ornare. Donec tristique molestie eleifend. Mauris dignissim arcu sed urna auctor condimentum. Pellentesque rhoncus ante ut imperdiet consectetur. Duis blandit tortor dolor, ut mattis risus laoreet at. Donec eu dui ut enim pulvinar pharetra eu eget metus. In tortor ante, varius faucibus leo nec, malesuada aliquam neque. Quisque gravida, velit et iaculis tincidunt, quam augue condimentum purus, non elementum nisi magna vel odio.</p> 
      </div> 
     </div> 
     </body> 
    </text> 
</TEI> 
+1

一切看起來都很好。我還在Altova XML Spy中測試了您的輸入和xslt。我沒有得到'

'的輸出。這是完整的XSLT嗎?或者您是否遺漏了部分? –

+0

@markdark感謝您的關注。這是完整的XSLT,但我使用的是oXygen的XML編輯器,所以也許這與它有關。編輯:這似乎是它。從命令行運行saxon 9.1.0.8J給了我乾淨的輸出。謝謝! – CanOfBees

+0

如果您對我的答案滿意,請使用左側的接受答案按鈕。謝謝! –

回答

1

要回答你不是寫了所有您想添加xml:id元素的問題你可以替換模板:

<!-- add xml:id to document node --> 
<xsl:template match="TEI"> 
    <TEI xmlns="http://www.tei-c.org/ns/1.0" xml:id="{$vID-primary}"> 
     <xsl:apply-templates/> 
    </TEI> 
</xsl:template> 

<!-- add xml:id to divs --> 
<xsl:template match="div"> 
    <div> 
     <xsl:if test="@type"> 
      <xsl:attribute name="type"> 
       <xsl:value-of select="@type"/> 
      </xsl:attribute> 
     </xsl:if> 
     <xsl:if test="@n"> 
      <xsl:attribute name="n"> 
       <xsl:value-of select="@n"/> 
      </xsl:attribute> 
     </xsl:if> 
     <xsl:attribute name="xml:id"> 
      <xsl:value-of select="generate-id(.)"/> 
     </xsl:attribute> 
     <xsl:apply-templates/> 
    </div> 
</xsl:template> 

有了:

<!-- add xml:id to all elements that do not need more adjustments --> 
<xsl:template match="TEI | div"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:attribute name="xml:id"> 
      <xsl:value-of select="generate-id(.)"/> 
     </xsl:attribute> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

然後,您可以延長<xsl:template match="TEI | div">你只想把xml:id額外中的所有元素。要放置xml:id和做其他的東西元素可以被寫入到一個單獨的模板或添加某種形式的xsl:choose


關於<p part="N">問題。這在Altova XMLSpy中不會發生。