2011-05-03 110 views
1

我正在使用XSLT清理某些與InDesign相關的XML以便在其他系統中使用。我需要能夠從嵌套在文本主體中的標籤獲取值,然後將其刪除。使用XSLT獲取元素的值然後將其刪除

具體來說,標題和旁行嵌入在文本正文中。我需要能夠提取這些信息並將它們放在標題標籤中 - 我能夠做到這一點,但我似乎無法在我處理它時將它們從身體中取出。

這是我(簡化)XML:

<?xml version="1.0" encoding="UTF-8"?> 
<k4Export xmlns="http://www.vjoon.com/K4Export/1.4.2"> 
    <publication> 
     <id>107233722</id> 
     <name>NGM</name> 
     <origin>origin</origin> 
     <issue> 
      <article> 
       <textObjects> 
        <textObject> 
         <text> 
          <inlineTag name="Story"> 
           <inlineTag name="body"> 
            <inlineTag name="headline">The Headline</inlineTag> Lorem ipsum dolor sit amet, 
            consectetur adipiscing elit. <em>Vivamus mollis</em> ligula quis mi 
            blandit interdum. In rutrum imperdiet suscipit. Fusce interdum, 
            sem id scelerisque molestie, purus ligula fringilla sapien, nec 
            auctor velit eros eget felis. Duis eu tellus purus. Donec id viverra 
            neque.</inlineTag> 

            <inlineTag name="body">Donec nec nulla neque, sit amet placerat 
             elit. Nulla pulvinar elit sapien. Donec venenatis, arcu sed 
             pellentesque ultrices, neque mi sollicitudin elit, nec fermentum 
             eros nibh aliquam leo. Nam lectus neque, dapibus in scelerisque 
             in, fermentum nec ipsum.</inlineTag> 

            <inlineTag name="body">Sed sed <strong>congue</strong> neque. Nulla 
            nec ipsum vitae lacus consectetur convallis sed et nulla. Integer 
            posuere viverra felis, at pulvinar risus scelerisque ac. Aliquam a 
            orci ac est iaculis porta. Duis sollicitudin lectus sit amet velit 
            condimentum lobortis. 
            <inlineTag name="byline">-John Doe</inlineTag></inlineTag></inlineTag> 
         </text> 
        </textObject> 
       </textObjects> 
      </article> 
     </issue> 
    </publication> 
</k4Export> 

而且這裏是我使用改造XSLT。我可以將標題和副標題放入標題中,但我無法將其從內容中刪除。我是XSLT noob,所以任何建議將不勝感激。 textObject元素遍佈XML文檔,因此我故意使用非常普遍的XPath選擇器來訪問它們。

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet 
    xmlns:default="http://www.vjoon.com/K4Export/1.4.2" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0" 
    exclude-result-prefixes="default"> 

    <!-- Output Content --> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Sample</title> 
      </head> 

      <body> 

       <!-- Headline--> 
       <xsl:variable name="headlines" select="//default:inlineTag[@name='headline']" /> 
       <xsl:choose> 
        <xsl:when test="$headlines"> 
         <xsl:for-each select="$headlines"> 
          <h1 class="headline"><xsl:value-of select="node()"/></h1> 
         </xsl:for-each> 
        </xsl:when> 
        <xsl:otherwise> 
         <h1 class="headline">Headline Absent</h1> 
        </xsl:otherwise> 
       </xsl:choose> 

       <!-- Bylines --> 
       <xsl:variable name="bylines" select="//default:inlineTag[@name='byline']" /> 
       <xsl:choose> 
        <xsl:when test="$bylines"> 
         <xsl:for-each select="$bylines"> 
          <h2 class="byline"><xsl:value-of select="node()"/></h2> 
         </xsl:for-each> 
        </xsl:when> 
        <xsl:otherwise> 
         <h2 class="byline">Byline Absent</h2> 
        </xsl:otherwise> 
       </xsl:choose> 

       <div id="content"> 

        <!-- body --> 
        <xsl:variable name="bodies" select="//default:inlineTag[@name='body']" /> 
        <xsl:choose> 
         <xsl:when test="$bodies"> 
          <xsl:for-each select="$bodies"> 
           <p><xsl:value-of select="node()"/></p> 
          </xsl:for-each> 
         </xsl:when> 
        </xsl:choose> 

       </div> 

      </body> 
     </html> 

    </xsl:template> 

</xsl:stylesheet> 
+0

@ user646151:這個輸入樣本的準確輸出是什麼? – 2011-05-03 22:29:28

+0

好問題,+1。看到我的答案是一個簡單明瞭的解決方案。發現模板,發現XSLT。 :) – 2011-05-04 04:20:51

回答

1

我想你想是這樣的(注意<xsl:for-each>現在由<xsl:apply-templates>替代,也有用於處理inlineTag元素與他們name屬性的不同值不同的模板,特別是空濃郁的模板不要將它們匹配的節點複製到輸出中)。除此之外,我還沒有試圖重新考慮或改進你的代碼 - 它有很大的改進潛力。

結果現在不包含標題或者是由標題

<xsl:stylesheet  xmlns:default="http://www.vjoon.com/K4Export/1.4.2"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0"  exclude-result-prefixes="default"> 
    <!-- Output Content --> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Sample</title> 
      </head> 
      <body> 
       <!-- Headline--> 
       <xsl:variable name="headlines" select="//default:inlineTag[@name='headline']" /> 
       <xsl:choose> 
        <xsl:when test="$headlines"> 
         <xsl:for-each select="$headlines"> 
          <h1 class="headline"> 
           <xsl:value-of select="node()"/> 
          </h1> 
         </xsl:for-each> 
        </xsl:when> 
        <xsl:otherwise> 
         <h1 class="headline">Headline Absent</h1> 
        </xsl:otherwise> 
       </xsl:choose> 
       <!-- Bylines --> 
       <xsl:variable name="bylines" select="//default:inlineTag[@name='byline']" /> 
       <xsl:choose> 
        <xsl:when test="$bylines"> 
         <xsl:for-each select="$bylines"> 
          <h2 class="byline"> 
           <xsl:value-of select="node()"/> 
          </h2> 
         </xsl:for-each> 
        </xsl:when> 
        <xsl:otherwise> 
         <h2 class="byline">Byline Absent</h2> 
        </xsl:otherwise> 
       </xsl:choose> 
       <div id="content"> 
        <!-- body --> 
        <xsl:apply-templates select="//default:inlineTag[@name='body']" /> 
       </div> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="default:inlineTag[@name='body']"> 
     <p> 
     <xsl:apply-templates/> 
     </p> 
    </xsl:template> 

    <xsl:template priority="10" match= 
    "default:inlineTag[@name='byline' or @name='headline']"/> 

</xsl:stylesheet> 
+0

感謝您的幫助! – Scott 2011-05-04 14:02:19

+0

@ user646151:不客氣。 – 2011-05-04 14:32:44

相關問題