Using XSLT as an XML pre-processor

后端 未结 2 1857
春和景丽
春和景丽 2021-01-21 16:41

This is my first time doing anything with XSLT, or XML really, so please excuse me. I\'ve found XSLT web documentation is really terse.

I have an XML file that I want to

相关标签:
2条回答
  • 2021-01-21 16:59

    You're doing really well for someone who's only just beginning with XSLT and XML.

    This isn't an answer to your question, but I just wanted to say that this might be a safer "copy by default" template:

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

    Yours works by grace of a certain default built-in template. But you might get strange behaviour regarding text nodes (or other things that aren't elements) when you add more templates, since the default has a low priority.

    0 讨论(0)
  • 2021-01-21 17:08

    I've worked out how to do it as below, but some parts such as the "contents" variable didn't seem like the best way to handle this.

    Well, basically you got it right. You can still improve it a little, though:

    <xsl:variable name="defines" select="document($defines-uri)/defines"/>
    
    <xsl:template match="ifdef">
      <xsl:variable name="this" select="."/>
    
      <xsl:for-each select="$defines[def = $this/@select]">
        <xsl:apply-templates select="$this/node()" />
      </xsl:for-each>
    </xsl:template>
    

    The <xsl:for-each> changes the context node. Within it, the . refers to the node being iterated over, not the one that had been matched by the <xsl:template>.

    That means you have to preseve the "outer" context in a variable, this is standard practice.

    0 讨论(0)
提交回复
热议问题