xslt for' n'重复的元素创造了' n'产量

时间:2016-03-11 20:06:12

标签: xslt

请您,您认为可以作为解决方案的任何想法都会有所帮助。我被要求提出xslt样式表,它动态地为n个重复元素作为输入创建n个重复元素。例如,在父元素A下,有许多子元素具有不同的值,但我只需要提取Element1,Element2,... n 元素的值,并希望获得结果 ñ结果。

@Override
protected Void doInBackground(String... params) {
    try {
        URL url = new URL(url_string);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.connect();
        if( conn.getResponseCode() == HttpURLConnection.HTTP_OK ){
            InputStream is = conn.getInputStream();
            String result = convertStreamToString(is);
            Log.d("debugLog", "Data from server: " + result);
            callback.gotSQLResult(new JSONArray(result));
        }else{
            InputStream err = conn.getErrorStream();
            Log.e("SQLConnector", convertStreamToString(err));
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return null;
}

2 个答案:

答案 0 :(得分:0)

您可以从更多模板方法中受益。例如,要将input元素更改为output元素,您将拥有以下模板:

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

但是您不需要很多模板来更改Element元素的名称。对于那些人,你需要一些额外的条件检查......

<xsl:template match="input/*/*[starts-with(name(), 'Element')]">
    <Result>
        <xsl:apply-templates select="@*|node()"/>
    </Result>
</xsl:template>

您将拥有一个类似的模板来删除非Element元素。

<xsl:template match="input/*/*[not(starts-with(name(), 'Element'))]" />

这样可以避免硬编码nameIDaddress

试试这个XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

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

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

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

    <xsl:template match="input/*/*[starts-with(name(), 'Element')]">
        <Result>
            <xsl:apply-templates select="@*|node()"/>
        </Result>
    </xsl:template>

    <xsl:template match="input/*/*[not(starts-with(name(), 'Element'))]" />
</xsl:stylesheet>

注意,您可以稍微简化一下,并使用模板优先级删除对元素名称的重复检查。尝试用这些替换最后两个模板......

<xsl:template match="input/*/*[starts-with(name(), 'Element')]" priority="2">
    <Result>
        <xsl:apply-templates select="@*|node()"/>
    </Result>
</xsl:template>

<xsl:template match="input/*/*" />

答案 1 :(得分:0)

你的意思是这样的:

XSLT样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
 <xsl:template match="input">
  <output>
    <xsl:apply-templates>

    </xsl:apply-templates>      
  </output>    
 </xsl:template>

  <xsl:template match="input/*">
   <xsl:element name="{name()}">
    <xsl:apply-templates></xsl:apply-templates>
   </xsl:element>      
  </xsl:template>


  <xsl:template match="input/*/*">
    <xsl:if test="contains(name(),'Element')">
    <xsl:element name="Result">
        <xsl:value-of select="current()"/>
    </xsl:element>


    </xsl:if>
  </xsl:template>


</xsl:stylesheet>

XML Sample(你的):

<input>
    <A>
        <Element1>Value1</Element1>
        <Element2>Value2</Element2>
        <Element3>Value3</Element3>
        <name>name</name>
        <ID>idmumber</ID>
        <address>address</address>
    </A>
    <B>
        <Element1>Value1</Element1>
        <Element2>Value2</Element2>
        <name>name</name>
        <ID>idmumber</ID>
        <address>address</address>
    </B>
</input>

结果:

<?xml version="1.0" encoding="UTF-8"?><output>
    <A>
        <Result>Value1</Result>
        <Result>Value2</Result>
        <Result>Value3</Result>



    </A>
    <B>
        <Result>Value1</Result>
        <Result>Value2</Result>



    </B>
</output>