我正在尝试编写一个XSLT文件,该文件将处理Android Activity布局xml文件并创建HTML等效文件。
在创建/测试xslt文件时,我使用的是 eclipse xslt 工具。
此路径上的障碍之一是,许多值未直接保存在Android布局文件中(例如字符串/文本值),而是保存在位于“values”文件夹中的单独xml文件中
我一直在尝试使用xslt函数'document'打开strings.xml文件,但没有成功。
问:我是否需要启用允许xslt文档功能运行的eclipse权限?
问:我对文档功能的运作方式有何不足之处?
尝试访问android strings.xml文件的 TextView 模板(在xslt文件中)中包含的行是:
<xsl:value-of select="document('../values/strings.xml')/String[@name=substring-after(@android:text,'/')]" />
以下是代码示例:
Android XML布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- This is the full screen vertical layout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="vertical" >
<!-- This is the main content vertical layout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="@dimen/mainHeadingIndent" >
<!-- This is the Status Section Vertical content layout -->
<TextView
style="@style/HeadingTextStyle"
android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight=".5"
android:text="@string/Status"/>
**The rest of the layout file is intentionally omitted**
这是XSLT文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:android="http://schemas.android.com/apk/res/android">
<xsl:output method="html" version="4.0" encoding="iso-8859-1"
indent="yes" />
<xsl:template match="/">
<html>
<head>
</head>
<body>
<xsl:for-each select="LinearLayout">
<xsl:call-template name="LinearLayout">
</xsl:call-template>
</xsl:for-each>
</body>
</html>
</xsl:template>
<xsl:template name="LinearLayout">
<xsl:variable name="width">
<xsl:value-of select="@android:layout_width" />
</xsl:variable>
<xsl:variable name="height">
<xsl:value-of select="@android:layout_height" />
</xsl:variable>
<xsl:variable name="margin">
<xsl:value-of select="@android:layout_margin" />
</xsl:variable>
<xsl:variable name="orient">
<xsl:value-of select="@android:orientation" />
</xsl:variable>
<xsl:variable name="pos">
<xsl:number value="position()" format="1" />
</xsl:variable>
<div div_pos='{$pos}' Width='{$width}' Height='{$height}' Margin='{$margin}'
Orient='{$orient}'>
<xsl:for-each select="LinearLayout">
<xsl:call-template name="LinearLayout">
</xsl:call-template>
</xsl:for-each>
<xsl:for-each select="TextView">
<xsl:call-template name="TextView">
</xsl:call-template>
</xsl:for-each>
<xsl:for-each select="ImageButton">
<xsl:call-template name="ImageButton">
</xsl:call-template>
</xsl:for-each>
<xsl:for-each select="Spinner">
<xsl:call-template name="Spinner">
</xsl:call-template>
</xsl:for-each>
<xsl:for-each select="Button">
<xsl:call-template name="Button">
</xsl:call-template>
</xsl:for-each>
</div>
</xsl:template>
<xsl:template name="ImageButton">
<div id="{@android:id}">
<xsl:comment>
ImageButton
</xsl:comment>
</div>
</xsl:template>
<xsl:template name="TextView">
<xsl:variable name="pos">
<xsl:number value="position()" format="1" />
</xsl:variable>
Text field =
<xsl:value-of select="@android:text" />
<xsl:variable name="txt">
<xsl:choose>
<xsl:when test="contains(@android:text,'/')">
<xsl:value-of select="document('../values/strings.xml')/String[@name=substring-after(@android:text,'/')]" />
<!--
<xsl:value-of select="substring-after(@android:text,'/')" />
-->
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@android:text" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<div id="{@android:id}">
<xsl:comment>
TextView Element
</xsl:comment>
<p>
Text pointer is: <xsl:value-of select="$txt" />
</p>
<!-- <p>Text pointer is:<xsl:copy-of select="$txt"/></p> <xsl:value-of
select="document('../values/strings.xml')/String[@name=$txt]" />
<xsl:value-of select="substring-after(@android:text,'/')" />
-->
</div>
endoftext
<br />
</xsl:template>
<xsl:template name="Spinner">
<div id="{@android:id}">
<xsl:comment>
Spinner
</xsl:comment>
</div>
</xsl:template>
<xsl:template name="Button">
<div id="{@android:id}">
<xsl:comment>
Button
</xsl:comment>
</div>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
您需要在XPath中包含文档的根元素(这很容易忘记):
<xsl:value-of select="document('../values/strings.xml')/*/String[@name=substring- after(@android:text,'/')]" />
答案 1 :(得分:0)
好吧,我已经解决了。 最大的问题是,当xslt失败时,它通常会无声地失败....即没有错误
问题证明不是文件功能本身。这是文档功能之后的选择标准。这有一个问题,即没有选定的节点,因此没有声明的输出。这一切都使文档功能看起来不起作用。
最大的变化是substring-after子句没有/没有针对right属性进行评估。通过拆分子串子句,它开始工作。 正如他们所说,它是“FM”(翻转魔法)!
以下是我用以下内容替换文档行的内容:
<xsl:variable name='string_value'>
<xsl:value-of select="substring-after(@android:text,'/')" />
</xsl:variable>
<xsl:value-of select="$string_value"/>
<xsl:value-of select="document('../values/strings.xml')/*/string[@name=$string_value]"/>
这成功地从strings.xml文件中提取了正确的值。