ohos-libxslt 是为 OpenHarmony 平台编译的 libxslt XSLT 转换库。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 libxslt 库,包括 HNP 包的打包、安装和使用方法。
📋 目录
一、项目概述
1.1 libxslt 库简介
libxslt 是一个基于 libxml2 的 XSLT(eXtensible Stylesheet Language Transformations)处理器。XSLT 是一种用于将 XML 文档转换为其他格式(如 HTML、XML、文本等)的语言。
核心特性:
- 🔄 XSLT 转换:完整的 XSLT 1.0 实现
- 📝 XML 转换:将 XML 转换为 HTML、XML、文本等格式
- 🔍 XPath 支持:基于 libxml2 的 XPath 支持
- ⚡ 高性能:针对大型 XML 文档优化
- 🔧 扩展函数:支持 EXSLT 扩展函数集
- 🎯 标准兼容:完全符合 XSLT 1.0 和 XPath 1.0 标准
主要应用场景:
- XML 到 HTML 的转换
- XML 文档格式转换
- 数据格式转换和报告生成
- Web 内容生成
- 文档处理和发布

1.2 项目信息
| 项目信息 | 详情 |
|---|---|
| 项目名称 | ohos-libxslt |
| 版本 | 1.1.43(libxslt 官方版本) |
| 许可证 | MIT License |
| 目标平台 | 鸿蒙PC (aarch64-linux-ohos) |
| 源码仓库 | https://gitlab.gnome.org/GNOME/libxslt |
| 适配仓库 | https://github.com/Harmonybrew/ohos-libxslt |
| 预构建包 | https://github.com/Harmonybrew/ohos-libxslt/releases |
| 编译方式 | 交叉编译(Cross Compilation,使用 CMake) |
| 依赖库 | libxml2 |
1.3 libxslt 核心功能
libxslt 提供的主要功能模块:
- XSLT 转换:执行 XSLT 样式表转换 XML 文档
- EXSLT 扩展:支持 EXSLT 扩展函数集(日期、数学、字符串等)
- XPath 支持:基于 libxml2 的完整 XPath 1.0 支持
- 样式表编译:预编译 XSLT 样式表以提高性能
- 参数传递:支持向 XSLT 样式表传递参数
- 输出格式:支持 XML、HTML、文本等多种输出格式
1.4 为什么需要 ohos-libxslt?
在鸿蒙PC上进行开发时,我们经常需要:
- ✅ XML 转换:将 XML 文档转换为其他格式
- ✅ 数据转换:在不同数据格式间进行转换
- ✅ 报告生成:从 XML 数据生成 HTML 报告
- ✅ 开发工具链:作为完整的开发工具链的一部分
二、为什么需要 HNP 包
2.1 系统安全限制
重要说明: 在鸿蒙PC上,由于系统安全规格限制等原因,暂不支持通过"解压 + 配 PATH"的方式直接使用 tar.gz 包。
这意味着:
- ❌ 不能直接解压 tar.gz 包到任意目录
- ❌ 不能通过设置 PATH 环境变量来使用
- ✅ 必须打包成 HNP(HarmonyOS Native Package)格式才能正常使用
2.2 HNP 包的优势
HNP 包是鸿蒙PC的官方包管理格式,具有以下优势:
- ✅ 系统集成:与鸿蒙PC的包管理系统集成
- ✅ 安全可靠:通过官方工具安装,符合系统安全规范
- ✅ 易于管理:支持安装、卸载、更新等操作
- ✅ 路径规范:统一安装在
/data/service/hnp/目录下
2.3 其他平台的使用方式
在鸿蒙开发板上:
可以使用传统的"解压 + 配 PATH"方式:
# 使用 hdc 推送文件到设备
hdc file send libxslt-*-ohos-arm64.tar.gz /data
# 进入设备 shell
hdc shell
# 解压并配置
cd /data
tar -zxf libxslt-*-ohos-arm64.tar.gz
export PATH=$PATH:/data/libxslt-*-ohos-arm64/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/libxslt-*-ohos-arm64/lib
三、HNP 包打包方法
3.1 准备工作
在开始打包之前,需要准备以下内容:
- 预构建的 tar.gz 包:从 release 页面 下载
- libxml2 库:libxslt 依赖 libxml2,需要先安装 libxml2
- hnpcli 工具:鸿蒙PC的包管理工具
- 打包脚本:用于自动化打包过程
3.2 下载预构建包
# 下载 libxslt 预构建包
wget https://github.com/Harmonybrew/ohos-libxslt/releases/download/v1.1.43/libxslt-1.1.43-ohos-arm64.tar.gz
3.3 创建打包脚本
创建一个 pack_hnp.sh 脚本来自动化打包过程:
#!/bin/bash
set -e
# 配置变量
LIBXSLT_VERSION="1.1.43"
TAR_FILE="libxslt-${LIBXSLT_VERSION}-ohos-arm64.tar.gz"
EXTRACT_DIR="libxslt-${LIBXSLT_VERSION}-ohos-arm64"
HNP_PUBLIC_PATH="/data/service/hnp"
LIBXSLT_INSTALL_PATH="${HNP_PUBLIC_PATH}/libxslt.org/libxslt_${LIBXSLT_VERSION}"
OUTPUT_DIR="output"
WORKDIR=$(pwd)
# 创建输出目录
mkdir -p ${OUTPUT_DIR}
# 解压 tar.gz 包
if [ ! -d "${EXTRACT_DIR}" ]; then
echo "解压 ${TAR_FILE}..."
tar -zxf ${TAR_FILE}
fi
# 创建安装目录
echo "创建安装目录..."
mkdir -p ${LIBXSLT_INSTALL_PATH}/{bin,lib,include}
# 复制文件
echo "复制文件..."
cp -r ${EXTRACT_DIR}/bin/* ${LIBXSLT_INSTALL_PATH}/bin/ 2>/dev/null || true
cp -r ${EXTRACT_DIR}/lib/* ${LIBXSLT_INSTALL_PATH}/lib/ 2>/dev/null || true
cp -r ${EXTRACT_DIR}/include/* ${LIBXSLT_INSTALL_PATH}/include/ 2>/dev/null || true
if [ -f "${EXTRACT_DIR}/Copyright" ]; then
cp ${EXTRACT_DIR}/Copyright ${LIBXSLT_INSTALL_PATH}/
fi
# 创建 hnp.json
echo "创建 hnp.json..."
cat > ${LIBXSLT_INSTALL_PATH}/hnp.json << 'EOF'
{
"type": "hnp-config",
"name": "libxslt",
"version": "1.1.43",
"install": {
"links": [
{
"source": "bin/xsltproc",
"target": "xsltproc"
}
]
}
}
EOF
# 设置执行权限
chmod +x ${LIBXSLT_INSTALL_PATH}/bin/* 2>/dev/null || true
# 使用 hnpcli 打包(如果可用)
if command -v hnpcli &> /dev/null; then
echo "使用 hnpcli 打包..."
hnpcli pack -i ${LIBXSLT_INSTALL_PATH} -o ${OUTPUT_DIR}/
echo "HNP 包已生成: ${OUTPUT_DIR}/libxslt.hnp"
else
echo "警告: 未找到 hnpcli 工具,跳过 HNP 包生成"
echo "请手动使用 hnpcli 打包:"
echo " hnpcli pack -i ${LIBXSLT_INSTALL_PATH} -o ${OUTPUT_DIR}/"
fi
# 生成 tar.gz 包(备用)
echo "生成 tar.gz 包..."
cd ${HNP_PUBLIC_PATH}/libxslt.org
tar -zcf ${WORKDIR}/${OUTPUT_DIR}/ohos_libxslt_${LIBXSLT_VERSION}.tar.gz libxslt_${LIBXSLT_VERSION}/
cd - > /dev/null
echo "打包完成!"
echo "输出文件:"
echo " - ${OUTPUT_DIR}/libxslt.hnp (如果 hnpcli 可用)"
echo " - ${OUTPUT_DIR}/ohos_libxslt_${LIBXSLT_VERSION}.tar.gz"
3.4 执行打包
# 赋予脚本执行权限
chmod +x pack_hnp.sh
# 执行打包
./pack_hnp.sh
3.5 验证打包结果
打包完成后,验证生成的文件:
# 检查 HNP 包
ls -lh output/libxslt.hnp
# 检查 tar.gz 包
ls -lh output/ohos_libxslt_*.tar.gz
# 验证安装目录结构
tree ${LIBXSLT_INSTALL_PATH}/
预期的安装目录结构:
/data/service/hnp/libxslt.org/libxslt_1.1.43/
├── bin/
│ └── xsltproc # XSLT 处理工具
├── lib/
│ ├── libxslt.a # 静态库
│ ├── libexslt.a # EXSLT 扩展库
│ └── libxslt.so # 动态库(如果构建)
├── include/
│ └── libxslt/ # 头文件目录
├── Copyright # 许可证文件
└── hnp.json # HNP 配置文件
四、安装与使用
4.1 安装 HNP 包
手动安装(使用 tar.gz)
# 在鸿蒙PC上执行
# 1. 解压 tar.gz 包
tar -xzf ohos_libxslt_*.tar.gz
# 2. 复制到安装目录
sudo cp -r libxslt_*/* /data/service/hnp/libxslt.org/libxslt_*/
# 3. 设置执行权限
sudo chmod +x /data/service/hnp/libxslt.org/libxslt_*/bin/*
# 4. 创建符号链接(根据 hnp.json 配置)
# hnp 系统会自动处理 links 配置
# 5. 配置库路径(如果使用动态库)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/service/hnp/libxslt.org/libxslt_*/lib
4.2 验证安装
# 检查 xsltproc 是否可用
xsltproc --version
# 应该显示 libxslt 的版本信息
# libxslt version 1.1.43
# 检查库文件
ls -lh /data/service/hnp/libxslt.org/libxslt_*/lib/
4.3 使用 libxslt
安装完成后,可以在代码中链接 libxslt 库,或使用 xsltproc 命令行工具。
五、使用示例
5.1 命令行工具使用
xsltproc - XSLT 转换工具
# 基本转换
xsltproc stylesheet.xsl input.xml > output.html
# 指定输出文件
xsltproc -o output.html stylesheet.xsl input.xml
# 传递参数
xsltproc --param name "value" stylesheet.xsl input.xml
# 使用多个样式表
xsltproc stylesheet1.xsl stylesheet2.xsl input.xml
# 验证模式
xsltproc --novalid stylesheet.xsl input.xml
5.2 XSLT 样式表示例
简单的 XML 到 HTML 转换
创建 example.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>转换结果</title>
</head>
<body>
<h1>数据列表</h1>
<xsl:for-each select="//item">
<p><xsl:value-of select="."/></p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
创建 input.xml:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<item>项目 1</item>
<item>项目 2</item>
<item>项目 3</item>
</data>
执行转换:
xsltproc example.xsl input.xml > output.html
5.3 C 代码中使用 libxslt
基本 XSLT 转换示例
创建 transform.c:
#include <stdio.h>
#include <libxslt/xslt.h>
#include <libxslt/xsltutils.h>
#include <libxslt/transform.h>
#include <libxslt/xsltInternals.h>
int main() {
xsltStylesheetPtr stylesheet = NULL;
xmlDocPtr doc = NULL, result = NULL;
const char *params[16 + 1];
int i;
// 初始化
xmlSubstituteEntitiesDefault(1);
xmlLoadExtDtdDefaultValue = 1;
// 加载样式表
stylesheet = xsltParseStylesheetFile((const xmlChar *)"stylesheet.xsl");
if (stylesheet == NULL) {
fprintf(stderr, "无法加载样式表\n");
return 1;
}
// 加载 XML 文档
doc = xmlParseFile("input.xml");
if (doc == NULL) {
fprintf(stderr, "无法解析 XML 文件\n");
xsltFreeStylesheet(stylesheet);
return 1;
}
// 设置参数
params[0] = NULL;
// 执行转换
result = xsltApplyStylesheet(stylesheet, doc, params);
// 保存结果
xsltSaveResultToFile(stdout, result, stylesheet);
// 释放资源
xsltFreeStylesheet(stylesheet);
xmlFreeDoc(doc);
xmlFreeDoc(result);
xsltCleanupGlobals();
xmlCleanupParser();
return 0;
}
编译和链接
# 编译程序
aarch64-unknown-linux-ohos-clang -o transform transform.c \
-I/data/service/hnp/libxslt.org/libxslt_1.1.43/include \
-I/data/service/hnp/libxml2.org/libxml2_2.15.0/include/libxml2 \
-L/data/service/hnp/libxslt.org/libxslt_1.1.43/lib \
-L/data/service/hnp/libxml2.org/libxml2_2.15.0/lib \
-lxslt -lxml2
5.4 使用参数
在样式表中使用参数
创建 param.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="title"/>
<xsl:template match="/">
<html>
<head><title><xsl:value-of select="$title"/></title></head>
<body>
<h1><xsl:value-of select="$title"/></h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
使用参数:
xsltproc --param title "'我的标题'" param.xsl input.xml
5.5 EXSLT 扩展函数
使用 EXSLT 日期函数
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="date">
<xsl:template match="/">
<p>当前日期: <xsl:value-of select="date:date()"/></p>
</xsl:template>
</xsl:stylesheet>
5.6 实际应用场景
XML 数据报告生成
# 从 XML 数据生成 HTML 报告
xsltproc report.xsl data.xml > report.html
数据格式转换
# 将 XML 转换为另一种 XML 格式
xsltproc convert.xsl source.xml > target.xml
批量转换
# 批量转换多个文件
for file in *.xml; do
xsltproc stylesheet.xsl "$file" > "output_${file}"
done
六、常见问题
6.1 如何链接 libxslt 库?
问题: 编译时找不到 libxslt 库。
解决方案:
-
指定头文件路径:
-I/data/service/hnp/libxslt.org/libxslt_1.1.43/include -I/data/service/hnp/libxml2.org/libxml2_2.15.0/include/libxml2 -
指定库文件路径:
-L/data/service/hnp/libxslt.org/libxslt_1.1.43/lib -L/data/service/hnp/libxml2.org/libxml2_2.15.0/lib -
链接库:
-lxslt -lxml2 -
完整编译命令:
aarch64-unknown-linux-ohos-clang -o program program.c \ -I/data/service/hnp/libxslt.org/libxslt_1.1.43/include \ -I/data/service/hnp/libxml2.org/libxml2_2.15.0/include/libxml2 \ -L/data/service/hnp/libxslt.org/libxslt_1.1.43/lib \ -L/data/service/hnp/libxml2.org/libxml2_2.15.0/lib \ -lxslt -lxml2
6.2 依赖 libxml2 的问题
问题: libxslt 需要 libxml2,如何确保正确链接。
解决方案:
确保 libxml2 已安装,并在编译时同时链接两个库:
# 先链接 libxslt,再链接 libxml2
-lxslt -lxml2
6.3 如何使用静态库?
问题: 希望使用静态库而不是动态库。
解决方案:
直接链接静态库文件:
aarch64-unknown-linux-ohos-clang -o program program.c \
-I/data/service/hnp/libxslt.org/libxslt_1.1.43/include \
-I/data/service/hnp/libxml2.org/libxml2_2.15.0/include/libxml2 \
/data/service/hnp/libxslt.org/libxslt_1.1.43/lib/libxslt.a \
/data/service/hnp/libxslt.org/libxslt_1.1.43/lib/libexslt.a \
/data/service/hnp/libxml2.org/libxml2_2.15.0/lib/libxml2.a
6.4 XSLT 转换错误
问题: xsltproc 转换时出现错误。
解决方案:
-
检查样式表语法:
xsltproc --novalid stylesheet.xsl input.xml -
查看详细错误信息:
xsltproc --debug stylesheet.xsl input.xml -
验证 XML 和 XSLT 文件:
xmllint --noout input.xml xmllint --noout stylesheet.xsl
6.5 如何从源码构建 libxslt?
参考项目的构建脚本和文档:
# 1. 准备构建环境
sudo apt update && sudo apt install -y build-essential cmake
# 2. 确保 libxml2 已安装
# libxslt 依赖 libxml2
# 3. 下载源码
git clone https://github.com/Harmonybrew/ohos-libxslt.git
cd ohos-libxslt
# 4. 使用 CMake 配置和编译
cmake -DCMAKE_TOOLCHAIN_FILE=path/to/toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=/path/to/install \
-DLIBXML2_DIR=/path/to/libxml2 \
-DLIBXSLT_WITH_PYTHON=OFF \
-DBUILD_SHARED_LIBS=OFF \
.
make
make install
七、总结与最佳实践
7.1 总结
libxslt 是强大的 XSLT 转换库,为鸿蒙PC提供了完整的 XML 转换能力:
- ✅ 功能全面:完整的 XSLT 1.0 实现和 EXSLT 扩展
- ✅ 性能优化:针对大型 XML 文档进行了优化
- ✅ 易于使用:提供命令行工具和 C API
- ✅ 标准兼容:完全符合 XSLT 1.0 和 XPath 1.0 标准
7.2 最佳实践
-
样式表设计:
- 使用模板匹配而不是硬编码路径
- 合理使用参数提高样式表复用性
- 优化 XPath 表达式提高性能
-
内存管理:
- 及时释放 xsltStylesheet、xmlDoc 等资源
- 使用 xsltFreeStylesheet、xmlFreeDoc 等函数
- 调用 xsltCleanupGlobals 清理全局状态
-
错误处理:
- 检查所有 API 调用的返回值
- 使用 xsltGetLastError 获取错误信息
- 正确处理转换错误
-
性能优化:
- 预编译样式表以提高性能
- 对于重复转换,缓存编译后的样式表
- 使用流式处理处理大文件
-
参数传递:
- 使用参数而不是硬编码值
- 合理使用参数提高样式表灵活性
- 注意参数的类型和格式
7.3 适用场景
libxslt 特别适合以下场景:
- ✅ XML 转换:将 XML 文档转换为其他格式
- ✅ 报告生成:从 XML 数据生成 HTML 报告
- ✅ 数据转换:在不同数据格式间进行转换
- ✅ Web 开发:生成动态 Web 内容
- ✅ 文档处理:文档格式转换和发布
780

被折叠的 条评论
为什么被折叠?



