2011-05-03 93 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

相关问题