1

我正在研究调用模板,源代码如下所示。

来源:

    <Content>
         <first>
                <text>
                Text
            </text>
            <link xmlns="Some namespace">
                <AA>abcd</AA>
                <BB>hi all</BB>
            </link>
         </first>

         <second>
         <link xmlns="Some other namespace">
                <AA>abcd1</AA>
                <BB>hi all21</BB>
            </link>
         </second>

          <three>
         <link xmlns="other namespace">
                <AA>abcd2</AA>
                <BB>hi all33</BB>
            </link>
         </three>
    </Content>

XSLT 写道:

           <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:n1="Some namespace" xmlns:n2="Some other namespace" xmlns:n3="other namespace">
        <xsl:output method="xml" indent="yes"/>

      <xsl:template match="Content">
       <xsl:call-template name="process">
         <xsl:with-param name="item" select="first/n1:link" />
    </xsl:call-template>
         <xsl:call-template name="process">
         <xsl:with-param name="item" select="second/n2:link" />
    </xsl:call-template>
         <xsl:call-template name="process">
         <xsl:with-param name="item" select="three/n3:link" />
    </xsl:call-template>


      </xsl:template>

      <xsl:template name="process">
        <xsl:param name="item" />
        <xsl:value-of select="$item/AA" />
      </xsl:template>

    </xsl:stylesheet>

我得到空白输出。我知道原因,因为我没有为它附加名称空间前缀。像“n1:A”那样。

由于即将多次到来。我写了一个模板并在需要的地方调用。但是每个链接的名称空间是不同的。如何修改我的代码,以便我可以重用模板“流程”。

任何人都可以帮助,我如何相应地修改“流程”模板以处理不同的命名空间但结构相同。

谢谢你。

4

2 回答 2

0

而不是这样做

<xsl:value-of select="$item/AA" />

您可以将表达式更改为此

<xsl:value-of select="$item/*[local-name() = 'AA'][namespace-uri()=namespace-uri($item)]" />

即检查没有命名空间的名称是“AA”,并且它与父元素具有相同的命名空间。这意味着如果您在“链接”元素中有另一个具有不同命名空间的“AA”元素,它将不会被拾取。

于 2012-06-01T06:16:12.933 回答
0

值得指出的是,这是一个设计不佳的 XML 文档。每当您看到有人创建两个命名空间 N1 和 N2 以使 N1 中的本地名称与 N2 中的本地名称相同时,您应该检测到设计气味。它们使人们处理 XML 变得更加困难。

当我看到这种输入时(如果人们错误地更改了他们词汇表版本 2 的名称空间 URI,有时会出现这种情况),我通常认为处理它的最佳方法是编写一个管道,其中第一阶段是规范化名称空间,这样“真正的”处理逻辑就不必像你的代码那样处理多个命名空间,这总是看起来像意大利面条。

于 2012-06-01T08:18:11.677 回答