请您,您认为可以作为解决方案的任何想法都会有所帮助。我被要求提出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;
}
答案 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'))]" />
这样可以避免硬编码name
,ID
和address
。
试试这个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>